前言
前面分享很多python內(nèi)容方面,但python僅僅是NetDevOps中比較重要的編程語言伦仍,并不代表其全部获搏,整個(gè)網(wǎng)絡(luò)自動化體系還有方方面面虑粥。比如正規(guī)企業(yè)都有DevOps流程如孝,研發(fā)人員要在開發(fā)環(huán)境提交代碼到Git代碼倉庫,要在測試環(huán)境進(jìn)行代碼集成和測試娩贷,測試正常要將代碼合并到預(yù)發(fā)/生產(chǎn)環(huán)境第晰,并在預(yù)發(fā)/生產(chǎn)環(huán)境進(jìn)行部署。這其中的精髓就是DevOps中的CI/CD彬祖,持續(xù)集成茁瘦,持續(xù)部署。
而NetDevOps在某些場景下也需要這些思想的融入储笑,所以自己又專門用Gitlab和Nornir走了一遍坑甜熔,幫助大家實(shí)踐一下Gitlab+Nornir的CI/CD流水線。本章節(jié)內(nèi)容盡可能做到保姆式教程南蓬,但還是需要有一點(diǎn)點(diǎn)Linux和Dokcer的基礎(chǔ)纺非,不然看起來稍有費(fèi)勁哑了。
1. 基礎(chǔ)環(huán)境準(zhǔn)備
1.1. CentOS 7安裝docker
#使用 root 權(quán)限登錄 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
#設(shè)置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中默認(rèn)只開啟stable倉庫,故這里安裝的是最新穩(wěn)定版17.12.0
$ sudo yum install <FQPN> # 例如:sudo yum install docker-ce-17.12.0.ce
#啟動并加入開機(jī)啟動
$ sudo systemctl start docker
$ sudo systemctl enable docker
#驗(yàn)證安裝是否成功(有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(最少預(yù)留2G內(nèi)存)
#拉取gitlab鏡像(ce免費(fèi))
docker pull gitlab/gitlab-ce
#運(yùn)行g(shù)itlab-ce容器炕淮,通常會將 GitLab 的配置 (etc) 拆火、 日志 (log) 、數(shù)據(jù) (data)放到容器之外涂圆, 便于日后升級们镜。
mkdir docker/gitlab
....(創(chuàng)建剩余文件夾忽略,最終文件目錄如下所示)
[root@localhost docker]# tree /root/docker/ -L 2
/root/docker/
└── gitlab
├── config
├── data
└── logs
#設(shè)置環(huán)境變量
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文件
#默認(rèn)使用docker id生成url润歉,需要改為服務(wù)器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時(shí)22端口映射的222端口
#重啟容器
docker restart gitlab
#等待一段時(shí)間(可能需要幾分鐘)模狭,查看容器狀態(tài)是**healthy**時(shí)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 )
#默認(rèn)賬號:root
#默認(rèn)密碼:1234567890
#如果默認(rèn)密碼錯(cuò)誤可按如下步驟踩衩,修改GitLab的root密碼:
#進(jìn)入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嚼鹉,然后進(jìn)行web登錄
2.3. 創(chuàng)建gitlab項(xiàng)目
創(chuàng)建項(xiàng)目后按照git操作指南和本地代碼(vscode/pycharm)關(guān)聯(lián),git基本操作可自行度娘驱富。
2.4. 本地代碼git遠(yuǎn)端
#本地代碼(IDE:vscode)git push到遠(yuǎn)端
(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. 創(chuàng)建測試環(huán)境代碼,并進(jìn)行遠(yuǎn)程push
創(chuàng)建分支
繼承之前master代碼
查看test_branch代碼是否繼承
2.6. 部署gitlab-runner
- GitLab提交持續(xù)集成服務(wù)褐鸥,當(dāng)你在項(xiàng)目根目錄中添加
.gitlab-ci.yml
文件线脚,并配置項(xiàng)目的運(yùn)行器(GitLab Runner
),那么后續(xù)的每次提交都會觸發(fā)CI流水線(pipeline
)的執(zhí)行叫榕。 -
.gitlab-ci.yml
文件告訴運(yùn)行器需要做哪些事情浑侥,默認(rèn)情況下,流水線有build
翠霍、test
锭吨、deploy
三個(gè)階段,即構(gòu)建
寒匙、測試
零如、部署
,未被使用的階段將會被自動忽略锄弱。 - 如果一切運(yùn)行正常(沒有非零返回值)考蕾,您將獲得與提交相關(guān)聯(lián)的漂亮綠色復(fù)選標(biāo)記(如下圖所示)。這樣可以在查看代碼之前輕松查看提交是否導(dǎo)致任何測試失敗会宪。
#增加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表示后續(xù)調(diào)用gitlab runner的名稱肖卧,最好和description保持一致,tags在后期的流水線配置中很重要掸鹅,不能胡寫塞帐。
注冊時(shí)需要提供url和token拦赠,在setting-CI/CD-runner中查看,我們需要分布在測試和生產(chǎn)環(huán)境中創(chuàng)建runners葵姥,tag分別為nornir_test荷鼠、nornir_deploy。注冊完成后榔幸,我們便可以在runner欄下看到注冊成功的runner允乐,其中綠色的表示runner正常:
2.7. 執(zhí)行GitLab-CI/CD流水線
2.7.1. 配置.gitlab-ci.yml文件
代碼倉庫根目錄下創(chuàng)建.gitlab-ci.yml文件,名稱固定且必須在根目錄下削咆,這個(gè)文件是CI/CD流水線關(guān)鍵牍疏。
.gitlab-ci.yml文件內(nèi)容如下:
# 該ci pipeline適合的場景
stages:
- install
- deploy
job1-test:
stage: install
# 所需執(zhí)行的腳本
only:
- test_branch
# 僅test_branch分支執(zhí)行
script:
- pip3 install -r requirements.txt --user
# 指定哪個(gè)ci runner跑該工作
tags:
- nornir
job1-master:
stage: install
# 所需執(zhí)行的腳本
only:
- master
# 僅master分支執(zhí)行
script:
- pip3 install -r requirements.txt --user
# 指定哪個(gè)ci runner跑該工作
tags:
- nornir_deploy
job2-test:
stage: deploy
# 所需執(zhí)行的腳本
only:
- test_branch
# 僅test_branch分支執(zhí)行
script:
- echo "starting"
- pip3 freeze
- python3 nornir_config.py
- echo "finished"
# 指定哪個(gè)ci runner跑該工作
after_script:
- sleep 5s
tags:
- nornir
job2-master:
stage: deploy
# 所需執(zhí)行的腳本
only:
- master
# 僅master分支執(zhí)行
script:
- python3 nornir_config.py
# 指定哪個(gè)ci runner跑該工作
after_script:
- sleep 5s
tags:
- nornir_deploy
CI/CD流水線的核心就是通過這個(gè)yaml文件的編寫,來實(shí)現(xiàn)自動化流程拨齐。
其中不同stage是串行執(zhí)行的鳞陨,比如上面的2個(gè)stage就是先進(jìn)行install內(nèi)容,在進(jìn)行deploy內(nèi)容瞻惋,而每個(gè)stage內(nèi)可以有多個(gè)jobs炊邦,這些內(nèi)容都是并行的,當(dāng)我們從本地把gitlab-ci文件push到gitlab上(或者直接在gitlab的項(xiàng)目內(nèi)創(chuàng)建)熟史,gitlab發(fā)現(xiàn)內(nèi)容有變動會執(zhí)行查看gitlab-ci文件,并進(jìn)行流水線操作窄俏。
2.7.2. 查看流水線內(nèi)容
可以看到流水線先進(jìn)行install內(nèi)容的操作蹂匹, 在進(jìn)行deploy內(nèi)容的操作。
安裝pip包
執(zhí)行nornir的python腳本
2.7.3. 合并分支
測試環(huán)境代碼執(zhí)行正常凹蜈,我們可以把整體代碼和文件合并到master分支限寞,在生產(chǎn)環(huán)境執(zhí)行。
分支合并請求正常需要上級審批仰坦,測試教程審批給自己就好履植。
點(diǎn)擊合并,會觸發(fā)生產(chǎn)環(huán)境的流水線
可看到生產(chǎn)環(huán)境狀態(tài)是passed悄晃,合并的測試環(huán)境分支
參考文獻(xiàn):
https://meigit.readthedocs.io/en/latest/gitlab_ci_.gitlab-ci.yml_detail.html
https://docs.gitlab.com/