前言
前面分享很多python内容,但python仅仅是NetDevOps中比较重要的编程语言,并不代表其全部,整个网络自动化体系还有方方面面。比如正规企业都有DevOps流程,研发人员要在开发环境提交代码到Git代码仓库,要在测试环境进行代码集成和测试,测试正常要将代码合并到预发/生产环境,并在预发/生产环境进行部署。这其中的精髓就是DevOps中的CI/CD,持续集成,持续部署。
而NetDevOps在某些场景下也需要这些思想的融入,所以自己又专门用Gitlab和Nornir走了一遍坑,帮助大家实践一下Gitlab+Nornir的CI/CD流水线。本章节内容尽可能做到保姆式教程,但还是需要有一点点Linux和Dokcer的基础,不然看起来稍有费劲。
1. 基础环境准备
1.1. CentOS 7安装docker
#使用 root 权限登录 Centos。确保 yum 包更新到最新。
sudo yum update
#卸载旧版本(如果安装过旧版本的话)
sudo yum remove docker docker-common docker-selinux docker-engine
#安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#设置yum源
sudo yum-config-manager --add-repo
#可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
#安装docker
$ sudo yum install docker-ce #由于repo中默认只开启stable仓库,故这里安装的是最新稳定版17.12.0
$ sudo yum install # 例如:sudo yum install docker-ce-17.12.0.ce
#启动并加入开机启动
$ sudo systemctl start docker
$ sudo systemctl enable docker
#验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
docker version
Client: Docker Engine - Community
Version: 20.10.7
API version: 1.41
Go version: go1.13.15
Git commit: f0df350
Built: Wed Jun 2 11:58:10 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.7
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: b0f5bc3
Built: Wed Jun 2 11:56:35 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.6
GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285d
runc:
Version: 1.0.0-rc95
GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
docker-init:
Version: 0.19.0
GitCommit: de40ad0
1.2. 安装GitLab(最少预留2G内存)
#拉取gitlab镜像(ce免费)
docker pull gitlab/gitlab-ce
#运行gitlab-ce容器,通常会将 GitLab 的配置 (etc) 、 日志 (log) 、数据 (data)放到容器之外, 便于日后升级。
mkdir docker/gitlab
....(创建剩余文件夹忽略,最终文件目录如下所示)
[root@localhost docker]# tree /root/docker/ -L 2
/root/docker/
└── gitlab
├── config
├── data
└── logs
#设置环境变量
export GITLAB_HOME=$HOME/docker/gitlab
#启动gitlab(docker)
sudo docker run --detach \\
--publish 443:443 --publish 80:80 --publish 222:22 \\
--name gitlab \\
--restart always \\
--volume $GITLAB_HOME/config:/etc/gitlab:Z \\
--volume $GITLAB_HOME/logs:/var/log/gitlab:Z \\
--volume $GITLAB_HOME/data:/var/opt/gitlab:Z \\
gitlab/gitlab-ce
2. 配置gitlab
2.1. 修改gitlab.rb文件
#默认使用docker id生成url,需要改为服务器IP地址
vim $HOME/gitlab/config/gitlab.rb
external_url ''
gitlab_rails['gitlab_ssh_host'] = ''
gitlab_rails['gitlab_shell_ssh_port'] = 222 # 此端口是run时22端口映射的222端口
#重启容器
docker restart gitlab
#等待一段时间(可能需要几分钟),查看容器状态是**healthy**时gitlab可使用。
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3a79b89a2ad5 gitlab/gitlab-ce "/assets/wrapper" 3 days ago Up 5 hours (healthy) 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:222->22/tcp, :::222->22/tcp gitlab
2.2. 登录gitlab(external_url )
#默认账号:root
#默认密码:1234567890
#如果默认密码错误可按如下步骤,修改GitLab的root密码:
#进入docker
docker exec -it gitlab bash
gitlab-rails console -e production
user = User.where(id: 1).first
user.password="12345678"
user.password_confirmation="12345678"
user.save!
#root密码修改为12345678,然后进行web登录
2.3. 创建gitlab项目
创建项目后按照git操作指南和本地代码(vscode/pycharm)关联,git基本操作可自行度娘。
2.4. 本地代码git远端
#本地代码(IDE:vscode)git push到远端
(py3venv) PS D:\\venv_project\\py3venv\\01-devnet\\cicd_nornir> ls
目录: D:\\venv_project\\py3venv\\01-devnet\\cicd_nornir
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2021/6/30 11:41 inventory
-a---- 2021/7/5 12:16 224 config.yaml
-a---- 2021/7/5 12:16 1198 nornir.log
-a---- 2021/7/5 12:16 1019 nornir_config.py
-a---- 2021/7/2 12:11 0 README.md
-a---- 2021/7/5 14:27 1087 requirements.txt
git add .
git commit -m "add. "
git push
登录gitlab的web页面,查看代码是否push成功
2.5. 创建测试环境代码,并进行远程push
创建分支
继承之前master代码
查看test_branch代码是否继承
2.6. 部署gitlab-runner
- GitLab提交持续集成服务,当你在项目根目录中添加
.gitlab-ci.yml
文件,并配置项目的运行器(GitLab Runner
),那么后续的每次提交都会触发CI流水线(pipeline
)的执行。 -
.gitlab-ci.yml
文件告诉运行器需要做哪些事情,默认情况下,流水线有build
、test
、deploy
三个阶段,即构建
、测试
、部署
,未被使用的阶段将会被自动忽略。 - 如果一切运行正常(没有非零返回值),您将获得与提交相关联的漂亮绿色复选标记(如下图所示)。这样可以在查看代码之前轻松查看提交是否导致任何测试失败。
#增加yum源
curl -L | sudo bash
#安装gitlab-runner
yum install gitlab-ci-multi-runner -y
#向GitLab-CI注册runner
[root@localhost docker]# gitlab-ci-multi-runner register
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. ):
Please enter the gitlab-ci token for this runner:
hwWzwM_9ujesGffmP4vB
Please enter the gitlab-ci description for this runner:
[localhost.localdomain]: nornir_test_new
Please enter the gitlab-ci tags for this runner (comma separated):
nornir_test_new
Whether to run untagged builds [true/false]:
[false]:
Whether to lock Runner to current project [true/false]:
[false]:
Registering runner... succeeded runner=hwWzwM_9
Please enter the executor: kubernetes, docker-ssh, shell, ssh, virtualbox, docker-ssh+machine, docker, parallels, docker+machine:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
#gitlab-ci tags表示后续调用gitlab runner的名称,最好和description保持一致,tags在后期的流水线配置中很重要,不能胡写。
注册时需要提供url和token,在setting-CI/CD-runner中查看,我们需要分布在测试和生产环境中创建runners,tag分别为nornir_test、nornir_deploy。注册完成后,我们便可以在runner栏下看到注册成功的runner,其中绿色的表示runner正常:
2.7. 执行GitLab-CI/CD流水线
2.7.1. 配置.gitlab-ci.yml文件
代码仓库根目录下创建.gitlab-ci.yml文件,名称固定且必须在根目录下,这个文件是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 --user
# 指定哪个ci runner跑该工作
tags:
- nornir
job1-master:
stage: install
# 所需执行的脚本
only:
- master
# 仅master分支执行
script:
- pip3 install -r requirements.txt --user
# 指定哪个ci runner跑该工作
tags:
- nornir_deploy
job2-test:
stage: deploy
# 所需执行的脚本
only:
- test_branch
# 仅test_branch分支执行
script:
- echo "starting"
- pip3 freeze
- python3 nornir_config.py
- echo "finished"
# 指定哪个ci runner跑该工作
after_script:
- sleep 5s
tags:
- nornir
job2-master:
stage: deploy
# 所需执行的脚本
only:
- master
# 仅master分支执行
script:
- python3 nornir_config.py
# 指定哪个ci runner跑该工作
after_script:
- sleep 5s
tags:
- nornir_deploy
CI/CD流水线的核心就是通过这个yaml文件的编写,来实现自动化流程。
其中不同stage是串行执行的,比如上面的2个stage就是先进行install内容,在进行deploy内容,而每个stage内可以有多个jobs,这些内容都是并行的,当我们从本地把gitlab-ci文件push到gitlab上(或者直接在gitlab的项目内创建),gitlab发现内容有变动会执行查看gitlab-ci文件,并进行流水线操作。
2.7.2. 查看流水线内容
可以看到流水线先进行install内容的操作, 在进行deploy内容的操作。
安装pip包
执行nornir的python脚本
2.7.3. 合并分支
测试环境代码执行正常,我们可以把整体代码和文件合并到master分支,在生产环境执行。
分支合并请求正常需要上级审批,测试教程审批给自己就好。
点击合并,会触发生产环境的流水线
可看到生产环境状态是passed,合并的测试环境分支
参考文献:
https://meigit.readthedocs.io/en/latest/gitlab_ci_.gitlab-ci.yml_detail.html
https://docs.gitlab.com/