银狐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 <https://download.docker.com/linux/centos/docker-ce.repo>

#可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r

#安装docker
$ sudo yum install docker-ce  #由于repo中默认只开启stable仓库,故这里安装的是最新稳定版17.12.0
$ sudo yum install <FQPN>  # 例如: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 '<http://192.168.137.108>'
gitlab_rails['gitlab_ssh_host'] = '<http://192.168.137.108>'
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 <https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh> | 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. <https://gitlab.com/>):
<http://192.168.137.108/>
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/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容