银狐NetDevOps-GitLab+Nornir3.1完成CI/CD测试+生产环境自动化流水线

image.png

前言

前面分享很多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 )

image.png
#默认账号: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项目

image.png

创建项目后按照git操作指南和本地代码(vscode/pycharm)关联,git基本操作可自行度娘。

image.png

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成功

image.png

2.5. 创建测试环境代码,并进行远程push

创建分支

image.png

继承之前master代码

image.png

查看test_branch代码是否继承

image.png

2.6. 部署gitlab-runner

  • GitLab提交持续集成服务,当你在项目根目录中添加 .gitlab-ci.yml 文件,并配置项目的运行器( GitLab Runner ),那么后续的每次提交都会触发CI流水线( pipeline )的执行。
  • .gitlab-ci.yml 文件告诉运行器需要做哪些事情,默认情况下,流水线有 buildtestdeploy 三个阶段,即 构建测试部署 ,未被使用的阶段将会被自动忽略。
  • 如果一切运行正常(没有非零返回值),您将获得与提交相关联的漂亮绿色复选标记(如下图所示)。这样可以在查看代码之前轻松查看提交是否导致任何测试失败。
#增加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正常:

image.png

2.7. 执行GitLab-CI/CD流水线

2.7.1. 配置.gitlab-ci.yml文件

代码仓库根目录下创建.gitlab-ci.yml文件,名称固定且必须在根目录下,这个文件是CI/CD流水线关键。

image.png

.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. 查看流水线内容

image.png

可以看到流水线先进行install内容的操作, 在进行deploy内容的操作。

安装pip包

image.png

执行nornir的python脚本

image.png

2.7.3. 合并分支

测试环境代码执行正常,我们可以把整体代码和文件合并到master分支,在生产环境执行。

image.png

分支合并请求正常需要上级审批,测试教程审批给自己就好。

image.png

点击合并,会触发生产环境的流水线

image.png

可看到生产环境状态是passed,合并的测试环境分支

image.png

参考文献:
https://meigit.readthedocs.io/en/latest/gitlab_ci_.gitlab-ci.yml_detail.html
https://docs.gitlab.com/

你可能感兴趣的:(银狐NetDevOps-GitLab+Nornir3.1完成CI/CD测试+生产环境自动化流水线)