Day05-01-jenkins进阶

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任务

image-20240523151832000

image-20240523152248778

image-20240523152348824

[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}}

image-20240523155356703

image-20240523155625747

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页面添加节点.

image-20240523160906264

image-20240523161331204

image-20240523161412486

image-20240523161751560

image-20240523161959502

image-20240523162111449

3)创建任务并绑定到指定节点中

image-20240523163303656

4)运行即可

image-20240523164456991

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

image-20240524134543913

2)启用基于RBAC的认证

  • 启动基于RBAC认证

image-20240524135024709

  • 在系统管理–>Manage and Assign Roles分配权限

  • 添加全局角色与具体job角色.

    • 全局只读.
    • 局部使用正则匹配目录和目录下jobs.

image-20240523165332602

image-20240523165448422

image-20240523165502472

image-20240523165521546

  • 访问测试

image-20240523165553570

image-20240523165629445

3)小结

  • 会使用基于rbac的认证即可.
  • 会配置即可.
  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值