CI/CD的意义:
CI/CD作为DevOps中的常见的术语,其含义是持续集成(Continuous Integration)、持续交付(Continuous Delivery) 、持续部署(Continuous Deployment) 的新方法。
简单来说,当我们修改了相关的代码,可以push到CI/CD的平台中,例如(GitLab、Jenkins),这些平台能够在push的代码发生变动后,实时执行代码操作,实现自动化配置。
CI/CD的思想结合到网络自动化运维中,便可以让我们减少对于设备的接触,并且提高部署上线的效率。当脚本发生更改时,我们仅需要将其push到CI/CD的平台上,便可以自动的在测试环境中自动部署,当我们检查无误后,又可以直接在生产环境中部署。详细思想的阐述可以看如下这篇文章:
https://www.linkedin.com/pulse/network-software-cicd-netdevops-andrea-dainese/
或者如下这个视频分析:
https://www.bilibili.com/video/BV1Cy4y1H7SC?from=search&seid=7669797109873246306
当然,目前业内思科也有了相应的解决方案,如果可以翻墙,可以参考视频教学:
https://www.youtube.com/watch?v=s3iDm0Mw-YE&t=466s
对应的GitHub链接如下:
https://github.com/CiscoDevNet/cml-cicd
实验目的:
通过GitLab CI/CD流水线,监控Nornor脚本,并实时进行测试部署。
本次实验将在“Nornor3.0.0入门实验”的基础上完成,实验链接如下:https://blog.csdn.net/tushanpeipei/article/details/117171537?spm=1001.2014.3001.5501
步骤一:GitLab私有仓库安装
实验环境:Centos8,已经提前安装好Docker。
子步骤1:拉取gitlab镜像
docker pull gitlab/gitlab-ce
ce是社区版本,免费。
子步骤2:运行gitlab-ce容器
通常会将 GitLab 的配置 (etc) 、 日志 (log) 、数据 (data)放到容器之外, 便于日后升级, 因此请先准备这三个目录。并确保目录存在并且已授予适当的权限。
在系统的根目录执行(存放的路径根据自己随意设置即可)。
mkdir -p /data/gitlab/etc /data/gitlab/log /data/gitlab/data
chmod 777 /data/gitlab/etc /data/gitlab/log /data/gitlab/data
然后创建容器
docker run -dit --name=gitlab --restart=always -p 8443:443 -p 80:80 -p 222:22 -v /data/gitlab/etc/:/etc/gitlab -v /data/gitlab/log:/var/log/gitlab -v /data/gitlab/data:/var/opt/gitlab --privileged=true gitlab/gitlab-ce
解释:
- -d:后台运行
- -p:将容器内部端口向外映射
- –name:命名容器名称
- -v:将容器内数据文件夹或者日志、配置等文件夹挂载到宿主机指定目录
- 8443:443:将http:8443映射到外部端口443
- 80:80:将web:80映射到外部端口80
- 222:22:将ssh:22映射到外部端口222
注意: 如果端口映射冲突可以自行更改端口。
查看容器是否启动:
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
881d0b875d3a gitlab/gitlab-ce "/assets/wrapper" 2 minutes ago Up 2 minutes (health: starting) 0.0.0.0:80->80/tcp, 0.0.0.0:222->22/tcp, 0.0.0.0:8443->443/tcp gitlab
子步骤3:修改gitlab.rb文件
按上面的方式,gitlab容器运行没问题,但在gitlab上创建项目的时候,生成项目的URL访问地址是按容器的hostname来生成的,也就是容器的id。作为gitlab服务器,我们需要一个固定的URL访问地址,于是需要配置gitlab.rb ,配置http协议所使用的访问地址。
首先需要将gitlab的容器stop一下:
docker stop gitlab
通过vim来编辑相应的配置:
vim /data/gitlab/etc/gitlab.rb
此文件中的所有信息都是被注释掉的,需要找到如下三行取消注释,并修改其中的内容。
配置http协议所使用的访问地址(宿主机地址),不加端口号默认为80:
external_url 'http://192.168.0.166'
配置ssh协议所使用的访问地址和端口:
gitlab_rails['gitlab_ssh_host'] = '192.168.0.166'
gitlab_rails['gitlab_shell_ssh_port'] = 222 # 此端口是run时22端口映射的222端口
保存配置文件并退出。
子步骤4:修改gitlab.yml文件
vim /data/gitlab/data/gitlab-rails/etc/gitlab.yml
设置host为自己的地址:
## GitLab settings
gitlab:
## Web server settings (note: host is the FQDN, do not include http://)
host: 192.168.0.166
port: 80
https: false
子步骤5:启动容器,登陆检查
docker start gitlab
输入命令后等待一段时间,使用命令docker ps查看容器的状态:
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
881d0b875d3a gitlab/gitlab-ce "/assets/wrapper" 24 minutes ago Up 2 minutes (healthy) 0.0.0. 0:80->80/tcp, 0.0.0.0:222->22/tcp, 0.0.0.0:8443->443/tcp gitlab
注意STATUS这里一定要是healthy。然后再游览器中输入192.168.0.166这个宿主机地址,进入到gitlab的页面。初次登陆会让你设置root账号的密码,并且需要满足一定的安全性要求,然后就可以通过root和你设置的密码进行登陆。
步骤二:将pycharm连接到GitLab
将本地的代码commit并push到gitlab项目中。
子步骤1:在pycharm中安装如下插件
子步骤2:添加gitlab的地址
子步骤3:Gitlab创建项目
设置项目名称:
找到项目的地址并复制:
子步骤4:pycharm将代码push到gitlab的项目中
设定自定义的远程链接:
将复制到的地址粘贴到其中:
Nornir代码和之前Nornir入门实验的相同,相关介绍请参考:
https://blog.csdn.net/tushanpeipei/article/details/117171537?spm=1001.2014.3001.5501
结构如下:
最后选择我们设置的nornir_cicd,commit代码后并选择push到master branch:
子步骤5:在gitlab项目中查看push的结果,并创建test_branch分支
如上图所示,已经将代码已经push到gitlab的对应项目中,默认在master branch中,这个branch的代码我们做生产环境部署使用:
创建test_branch,做测试使用:
选择Create from master:
可以看到在test_branch中查看得到从master branch继承的代码:
步骤三:安装GitLab runner
GitLab-Runner是配合GitLab-CI进行使用的。一般地,GitLab里面的每一个工程都会定义一个属于这个工程的软件集成脚本,用来自动化地完成一些软件集成工作。当这个工程的仓库代码发生变动时,比如有人push了代码,GitLab就会将这个变动通知GitLab-CI(已经自动安装)。这时GitLab-CI会找出与这个工程相关联的Runner,并通知这些Runner把代码更新到本地并执行预定义好的执行脚本。
所以,GitLab-Runner就是一个用来执行软件集成脚本的东西。你可以想象一下:Runner就像一个个的工人,而GitLab-CI就是这些工人的一个管理中心,所有工人都要在GitLab-CI里面登记注册,并且表明自己是为哪个工程服务的。当相应的工程发生变化时,GitLab-CI就会通知相应的工人执行软件集成脚本。如下图所示:
Centos中GitLab-Runner的安装与使用:
- 添加yum源:
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
- 安装runner:
yum install gitlab-ci-multi-runner
- 向GitLab-CI注册runner:
gitlab-ci-multi-runner register
向GitLab-CI注册一个Runner需要两样东西:GitLab-CI的url和注册token,其中这两个值可以在gitlab的如下地方找到:
除此之外,在注册时,还有两个地方需要注意:
- tags:表示后续调用gitlab runner的名称;
- executor,后续需要执行shell命令操作,这里我们敲上shell就行。
我们需要分布在测试和生产环境中创建runners,tag分别为nornir、nornir_deploy。注册完成后,我们便可以在runner栏下看到注册成功的runner,其中绿色的表示runner正常:
步骤四:执行CI/CD流水线
子步骤1:配置.gitlab-ci.yml文件
在根目录下创建一个.gitlab-ci.yml的文件,请注意这个文件的名称一定要固定,且一定要设置在根目录下。设置这个yml文件的目的是gitlab的CICD将根据其中定义的步骤进行流水线工作。
其实每一个stage可以包含多个job(名字可以自定义),每个job中需要去执行一个script文件,我们这里是脚本的目的是下载requirements.txt中的python包和执行nornir_config.py文件。本次实验中设置的CI/CD的步骤十分简单,真实的步骤还需要不断的去优化调整,.gitlab-ci.yml中信息如下:
# 该ci pipeline适合的场景
stages:
- install
- deploy
job1-test:
stage: install
# 所需执行的脚本
only:
- test_branch
# 仅test_branch分支执行
script:
- pip3 install -r requirements.txt
# 指定哪个ci runner跑该工作
tags:
- nornir
job1-master:
stage: install
# 所需执行的脚本
only:
- master
# 仅master分支执行
script:
- pip3 install -r requirements.txt
# 指定哪个ci runner跑该工作
tags:
- nornir_deploy
job2-test:
stage: deploy
# 所需执行的脚本
only:
- test_branch
# 仅test_branch分支执行
script:
- python3 nornir_config.py
# 指定哪个ci runner跑该工作
tags:
- nornir
job2-master:
stage: deploy
# 所需执行的脚本
only:
- master
# 仅master分支执行
script:
- python3 nornir_config.py
# 指定哪个ci runner跑该工作
tags:
- nornir_deploy
注意:其中tags需要和设置的gitlab runner的tag相对应。创建完成后commit并push到测试分支中:
测试分支中可以看到:
具体.gitlab-ci.yml文件的相关语法,请参考:
http://www.ttlsa.com/auto/gitlab-cicd-gitlab-ci-yml-configuration-tasks-detailed/
执行步骤图解如下:
gitlab目前已经根据.gitlab-ci.yml文件中的步骤执行stages。
子步骤2:查看每一个stage的执行的情况
在CI/CD栏中找到pipelines:
找到执行的pipeline,并进入stage1:
stage1:安装需要的python包
stage2:nornir对设备进行配置
子步骤3:测试分支OK后,我们可以合并到生产部署分支
选择source和target branch:
填写合并请求,这里指定的是自己,可以指定给上级或者其他有权限的人:
最后做批准,即可部署到生产环境:
查看CI/CD工作流程:
可以看到,已经部署到了生产环境。进一步检查生产环境的两个stage是否正常:
到此为止,我们完成了一套简单的CI/CD部署流程。
其他参考资料:
https://blog.csdn.net/lizhiqiang1217/article/details/88803783