Day05-01-jenkins進階
- 10. 案例07: 理解 案例06基于ans實現
- 10.1 整體流程
- 10.2 把shell改為Ansible劇本
- 10.3 jk調用ansible全流程
- 10.4 書寫劇本
- 11. Jenkins進階
- 11.1 jenkins分布式
- 1)概述
- 2)案例08:拆分docker功能
- 3)創建任務并綁定到指定節點中
- 4)運行即可
- 5)小結
- 11.2 rbac認證
- 1)插件
- 2)啟用基于RBAC的認證
- 3)小結
10. 案例07: 理解 案例06基于ans實現
10.1 整體流程
- 開發書寫代碼提交代碼+Dockerfile
- jk: 拉取代碼
- jk: 構建鏡像并推送到私有倉庫
- jk: 管理web,在web上拉取鏡像并運行容器 (shell,改為ans實現)
- web或lb: 進行測試.
10.2 把shell改為Ansible劇本
#vars
web_servers="172.16.1.82 "
#0.判斷git_tag是否為默認
if [ "$git_tag" = "origin/master" ];thengit_tag=latest
fi
#1. 構建鏡像
docker build -t reg.oldboylinux.cn:5000/oldboyedu/web:ngx_bird_${git_tag} .
#2. 推送到私有倉庫
#docker login -uxxx -pxxx 私有倉庫地址
docker push reg.oldboylinux.cn:5000/oldboyedu/web:ngx_bird_${git_tag}
#3. 部署web服務器
for ip in ${web_servers}
dossh root@${ip} "#0.未來可以加入判斷判斷端口是否占用#端口沖突手動解決.未來可以ansible實現.
# if [ `docker ps |grep -w 80 |wc -l` -eq 1 ];then#刪除占用80端口的容器
# fidocker ps |grep -w 80 |awk '{print $NF}'|xargs docker rm -f#0.未來可以加入判斷判斷容器的名字是否有沖突.if [ `docker ps -a |grep -w "ngx_bird_${git_tag}" |wc -l ` -eq 1 ];thendocker rm -f ngx_bird_${git_tag}fi#啟動docker run -d --name "ngx_bird_${git_tag}" \-p 80:80 --restart=always \reg.oldboylinux.cn:5000/oldboyedu/web:ngx_bird_${git_tag}"
done
- 需要修改的代碼
#3. 部署web服務器
for ip in ${web_servers}
dossh root@${ip} "#0.未來可以加入判斷判斷端口是否占用#端口沖突手動解決.未來可以ansible實現.
# if [ `docker ps |grep -w 80 |wc -l` -eq 1 ];then#刪除占用80端口的容器
# fidocker ps |grep -w 80 |awk '{print $NF}'|xargs docker rm -f#0.未來可以加入判斷判斷容器的名字是否有沖突.if [ `docker ps -a |grep -w "ngx_bird_${git_tag}" |wc -l ` -eq 1 ];thendocker rm -f ngx_bird_${git_tag}fi#啟動docker run -d --name "ngx_bird_${git_tag}" \-p 80:80 --restart=always \reg.oldboylinux.cn:5000/oldboyedu/web:ngx_bird_${git_tag}"
done
- 改完后 參考10.4部分
10.3 jk調用ansible全流程
-
依賴插件:
-
配置ansible任務
[root@devops-oldboy-jenkins /server/scripts]# cat test.yml
- hosts: webgather_facts: falsetasks:- name: testshell: hostname -I >>/tmp/test.log
[root@devops-oldboy-jenkins /server/scripts]# cat hosts
[web]
172.16.1.82
10.4 書寫劇本
- hosts: webvars:- img_name: "ngx_bird_{{ans_git_tag}}"gather_facts: falsetasks:- name: 1. 獲取80端口是否沖突#過濾宿主機占用80端口的容器shell: docker ps -a |grep ':80'#存放到port變量中json形式數據 port.rc返回值register: port#用于指定這個模塊什么條件下才算是報錯了.#'"not found" in port.stdout' 命令的結果中如果出現not found字樣比如command not found則報錯.#ignore_errors: truefailed_when: '"not found" in port.stdout'- name: 1. 獲取80端口是否沖突,如果有沖突則刪除容器shell: docker ps -a |grep ':80??'|awk
'{print $NF}' |xargs docker rm -f #當docker ps -a |grep ':80??'命令的返回值是0的
時候才會運行刪除容器的操作.#port.rc ?? 0when: port.rc ?? 0- name: 2. 獲取是否有重名的docker容器,如果有沖突則刪除
容器shell: docker ps -a |grep -w "{{img_name}}"register: container_namefailed_when: '"not found" in
container_name.stdout'- name: 2. 獲取是否有重名的docker容器,如果有沖突則刪除
容器shell: docker ps -a |grep -w "
{{img_name}}"|awk '{print $NF}' |xargs docker rm -f when: container_name.rc ?? 0- name: 3. 啟動容器shell: docker run -d ??name "{{img_name}}" -p
80:80 ??restart=always
reg.oldboylinux.cn:5000/oldboyedu/web:{{img_name}}
- 注釋版本
ansibe-playbook -i hosts test.yml -e ans_git_tag=${git_tag}
#-e ans_git_tag=${git_tag} ans_git_tag用于獲取前面參數化構建的時候創建的變量git_tag
- hosts: webvars:- img_name: "ngx_bird_{{ans_git_tag}}"gather_facts: falsetasks:- name: 1. 獲取80端口是否沖突#過濾宿主機占用80端口的容器shell: docker ps -a |grep ':80->'#存放到port變量中json形式數據 port.rc返回值register: port#用于指定這個模塊什么條件下才算是報錯了.#'"not found" in port.stdout' 命令的結果中如果出現not found字樣比如command not found則報錯.#ignore_errors: truefailed_when: '"not found" in port.stdout'- name: 1. 獲取80端口是否沖突,如果有沖突則刪除容器shell: docker ps -a |grep ':80->'|awk '{print $NF}' |xargs docker rm -f#當docker ps -a |grep ':80->'命令的返回值是0的時候才會運行刪除容器的操作.#port.rc == 0when: port.rc == 0- name: 2. 獲取是否有重名的docker容器,如果有沖突則刪除容器shell: docker ps -a |grep -w "{{img_name}}"register: container_namefailed_when: '"not found" in container_name.stdout'- name: 2. 獲取是否有重名的docker容器,如果有沖突則刪除容器shell: docker ps -a |grep -w "{{img_name}}"|awk '{print $NF}' |xargs docker rm -fwhen: container_name.rc == 0- name: 3. 啟動容器shell: docker run -d --name "{{img_name}}" -p 80:80 --restart=always reg.oldboylinux.cn:5000/oldboyedu/web:{{img_name}}
11. Jenkins進階
- jenkins分布式(主從master,slave 代理agent): 把jenkins工作拆分出來
- rbac權限控制
- pipeline(ans劇本)
11.1 jenkins分布式
1)概述
-
背景:
- jenkins服務器上運行maven編譯,ansible(執行劇本),docker build(構建鏡像)
- jenkins慢了
-
解決:
- 把一些功能拆分出去
- 運行指定任務的時候指定這個新的(jenkins)節點即可
2)案例08:拆分docker功能
-
目標:未來我們的任務中只有有docker build相關操作就交給對應docker節點.
-
添加節點
- 準備節點上安裝jdk/jre環境. yum install -y java-11
- web頁面添加節點.
3)創建任務并綁定到指定節點中
4)運行即可
5)小結
- 核心來理解什么是jenkins分布式與應用場景即可
- 使用流程:添加節點,添加任務的時候關聯節點即可
11.2 rbac認證
-
用于認證與權限控制
-
目前jenkins的認證,用戶與密碼,所有用戶權限一致,都是最高權限,權限混亂
-
rbac基于role(角色)的認證體系
-
角色(role)可以理解成權限集合
- dev-auto角色內部測試環境
- dev角色,可以管理所有的開發job(任務)
- ops可以管理生產環境job
-
未來把用戶或用戶組與對應的role關聯即可擁有相關的權限
1)插件
- Role-based Authorization Strategy
- Matrix Authorization Strategy Plugin
2)啟用基于RBAC的認證
- 啟動基于RBAC認證
-
在系統管理–>Manage and Assign Roles分配權限
-
添加全局角色與具體job角色.
- 全局只讀.
- 局部使用正則匹配目錄和目錄下jobs.
- 訪問測試
3)小結
- 會使用基于rbac的認證即可.
- 會配置即可.