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" ];then
git_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}
do
ssh root@${ip} "
#0.未来可以加入判断判断端口是否占用
#端口冲突手动解决.未来可以ansible实现.
# if [ `docker ps |grep -w 80 |wc -l` -eq 1 ];then
#删除占用80端口的容器
# fi
docker 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 ];then
docker 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}
do
ssh root@${ip} "
#0.未来可以加入判断判断端口是否占用
#端口冲突手动解决.未来可以ansible实现.
# if [ `docker ps |grep -w 80 |wc -l` -eq 1 ];then
#删除占用80端口的容器
# fi
docker 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 ];then
docker 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: web
gather_facts: false
tasks:
- name: test
shell: hostname -I >>/tmp/test.log
[root@devops-oldboy-jenkins /server/scripts]# cat hosts
[web]
172.16.1.82
10.4 书写剧本
- hosts: web
vars:
- img_name: "ngx_bird_{{ans_git_tag}}"
gather_facts: false
tasks:
- 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: true
failed_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 Վҧ 0
when: port.rc Վҧ 0
- name: 2. 获取是否有重名的docker容器,如果有冲突则删除
容器
shell: docker ps -a |grep -w "{{img_name}}"
register: container_name
failed_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: web
vars:
- img_name: "ngx_bird_{{ans_git_tag}}"
gather_facts: false
tasks:
- 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: true
failed_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 == 0
when: port.rc == 0
- name: 2. 获取是否有重名的docker容器,如果有冲突则删除容器
shell: docker ps -a |grep -w "{{img_name}}"
register: container_name
failed_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}}
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的认证即可.
- 会配置即可.