一、RBAC:基于角色的访问控制
安装插件
修改默认授权策略
新建测试用户
新建角色
全局
项目:通配
用户授权:
将创建的相关角色权限授权给用户
使用不同的用户登录,测试权限是否正确
二、pipeline:管线、流水线
相当于整合自由项目进行构建,更加精简,清晰,是一个更强大的功能
1.使用最新版安装ssh agent 插件
注意:下图版本ssh agent在add时会出错:ERROR: Failed to run ssh-add
,所以需要提前做好虚拟机间的免密连接:ssh-keygen;ssh-copy-id server6/192.168.56.16和ssh-copy-id server7/192.168.56.17(即加的节点与执行机进行免密)
新建流水线项目 docker_image_build;进行保存项目后,gitlab节点创建webhooks
gitlab节点创建webhooks(根据新建流水线项目新建webhooks,新建webhooks可参考:jenkins部署、应用(一);且jenkins部署、应用(一)创建webhooks可删除)
复制一下脚本并做相应修改:
本版本需要:192.168.56.16、192.168.56.17实现免密(即加的节点与执行机进行免密)
pipeline {
agent any ##所有
stages {
stage('check out') {
steps {
git credentialsId: '1d2a5968-6bce-4d29-b239-d5245988ce13', url: 'git@192.168.56.11:root/demo.git', branch: 'main'
} ##1d2a5968-6bce-4d29-b239-d5245988ce13:系统管理-凭据中,key标识,即gitURL对应凭据的UUID(在凭据中找对应的即可)
} ##git@192.168.56.11:root/demo.git:gitURL
stage('docker build') {
steps {
sh '''
cd $WORKSPACE
docker build -t reg.westos.org/library/demo:${BUILD_NUMBER} .
''' ##$WORKSPACE:变量--项目路径;“.” 为目录,即$WORKSPACE
} ##docker build:项目名称
}
stage('docker push') { ##执行docker push
steps {
sh '''
REPOSITORY=reg.westos.org/library/demo:${BUILD_NUMBER}
docker tag $REPOSITORY reg.westos.org/library/demo:latest ##tag
docker login reg.westos.org -u admin -p westos ##login
docker push $REPOSITORY ##
docker push reg.westos.org/library/demo:latest ##最新版本相映射
'''
}
}
stage('docker deploy') { ##部署;本版本安装插件后add有问题,和其他版本有差异
steps {
sh '''
ssh -o StrictHostKeyChecking=no -l root 192.168.56.17 """ ##ssh agent插件需要提前加
docker ps -a |grep myapp && docker rm -f myapp ##
docker rmi reg.westos.org/library/demo:latest
docker run -d --name myapp -p 80:80 reg.westos.org/library/demo:latest """
'''
}
}
}
}
成功如下图:
全流程测试:在gitlab主机修改并提交代码->触发docker_image_build流水线构建
补充:
1.若安装k8s插件,可以部署在k8s平台,构建任务就可以通过pod方式
2.由于web页面会缓存,部分修改可能与执行效果不一致,可清除浏览器缓存后,重新构建!
3.ssh-agent也可以从网站下载之前的版本:https://plugins.jenkins.io/ssh-agent/releases/
https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/ssh-agent/
ssh-agent:295.v9ca_a_1c7cc3a_a_
下载后在插件管理中安装即可
新建流水线项目 docker_image_build…继续操作即可
三、jenkins结合ansible参数化构建
主机环境
主机 | IP | 角色 |
---|---|---|
server5 | 192.168.56.15 | jenkins主机、ansible主机 |
server6 | 192.168.56.16 | 测试机test、devops sudo |
server7 | 192.168.56.17 | 测试机prod、devops sudo |
ansible无agent设计,通过ssh直接访问,所以需要把目标主机实现免密
此实验前:
检查前面实验建立的:系统管理-节点列表-docker1节点需要断开,并删除
master节点开启2个以上执行者数量
1.安装ansible
[root@server5 ~]# vim /etc/yum.repos.d/ansible.repo ##设置epel源
[ansible]
name=epel
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/
gpgcheck=0
[root@server5 ~]# yum list --showduplicates ansible ##列出所有版本
[root@server5 ~]# yum install -y ansible
server7同下配置(server6)
devops是测试机的ssh免密用户,并且配置sudo
[root@server6 ~]# useradd devops
[root@server6 ~]# echo westos | passwd --stdin devops
Changing password for user devops.
passwd: all authentication tokens updated successfully.
[root@server6 ~]# visudo ##给devops用户授权
在ansible主机上以jenkins身份配置ssh免密到所有测试机:
[root@server5 ~]# usermod -s /bin/bash jenkins ##修改用户登录Shell的命令
[root@server5 ~]# su - jenkins ##jenkins主机以jenkins用户身份访问
-bash-4.2$ ssh-keygen
-bash-4.2$ ssh-copy-id devops@192.168.56.16 ##以devops用户身份
-bash-4.2$ ssh-copy-id devops@192.168.56.17
2.新建gitlab项目
克隆项目
[root@server1 ~]# git clone git@192.168.56.11:root/playbook.git
[root@server1 ~]# cd playbook/
[root@server1 playbook]# vim ansible.cfg
[defaults]
command_warnings=False
remote_user=devops ##devops用户
[privilege_escalation]
become=True
become_method=sudo
become_user=root ##切成超户
become_ask_pass=False
[root@server1 playbook]# mkdir inventory
[root@server1 playbook]# cd inventory/
[root@server1 inventory]# vim test ##对象一:“测试机”;http_port=8000:变量
[test]
192.168.56.16 http_port=8000
[root@server1 inventory]# vim prod ##对象二:“生产机”
[prod]
192.168.56.17 http_port=8080
[root@server1 inventory]# cd ..
[root@server1 playbook]# vim playbook.yaml
---
- hosts: all
tasks:
- name: install the latest version of Apache
yum:
name: httpd
state: latest
- name: configure apache ##配置apache
template:
src: httpd.conf.j2 ##模板、在当前目录httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf ##目标路径
notify: restart apache ##
- name: Start service httpd, if not started ##启动
service:
name: httpd
state: started
enabled: yes
handlers: ##处理器
- name: restart apache ## restart apache 和上面notify保持一致
service:
name: httpd
state: restarted ##状态
[root@server1 playbook]# yum install -y httpd
[root@server1 playbook]# cp /etc/httpd/conf/httpd.conf .
[root@server1 playbook]# mv httpd.conf httpd.conf.j2
[root@server1 playbook]# vim httpd.conf.j2
...
Listen {{ http_port }}
推送项目
[root@server1 playbook]# git add .
[root@server1 playbook]# git status -s
[root@server1 playbook]# git commit -m "add playbook.yaml"
[root@server1 playbook]# git push -u origin main
3.jenkins新建项目
新建项目-自由风格:playbook
1.以jenkins身份,cd至/var/lib/jenkins/workspace/ansible目录
2.ansible-playbook -i…以jenkins身份执行命令
$deploy:根据参数化构建过程定义的名称,设置变量
选择参数构建
控制台输出
测试:
分别以jenkins身份:
curl 192.168.56.16:8000
curl 192.168.56.17:8080