自动化运维之CI/CD下——持续集成与持续交付
一、分离jenkins的构建功能jenkins服务器默认功能为:1、持续集成与持续交付2、构建但是实际成产环境中,要避免资源占用集中在一个节点上。因此需要将构建任务交给jenkins的“小弟”,即新建一个虚拟机作为jenkins的agent端,分担jenkins的工作量。新建agent节点,命名为server5。安装java支持:#在server5上安装jdkyum install -y java
目录
6、将jenkins脚本固定到gitlab中——Jenkinsfile
一、分离jenkins的构建功能——分布式构建
jenkins服务器默认功能为:
1、持续集成与持续交付
2、构建
但是实际成产环境中,要避免资源占用集中在一个节点上。因此需要将构建任务交给jenkins的“小弟”,即新建一个虚拟机作为jenkins的agent端,分担jenkins的工作量。
新建agent节点,命名为server5。
安装java支持:
#在server5上安装jdk
yum install -y java-1.8.0-openjdk.x86_64
#安装git
yum install -y git
这里添加server5的ssh用户名密码认证
agent节点添加完成后,如下所示:
这时如果不需要master做构建任务的话,可以按以下步骤,将“构建进程数”设置为0
这时master就不会有任何的构建进程了,也就不会参与构建。
server5的节点添加完成后,就可以用来参与构建了,所以需要先安装docker。
测试:查看构建步骤是否在agent上
可以看到,已经通过agent构建成功
注意:此项目构建时是通过git执行,从gitlab上拉取代码。因此在agent端必须安装git,否则将会构建失败。
截至目前,已经将构建任务分配到server5的agent上,减少了jenkins的负载。
二、jenkins流水线——pipeline
在jenkins中添加任务时,如果手动一个一个添加,在生产环境中效率很低还容易出错。因此需要通过流水线的方式,将多个任务串在一起自动执行。
1、新建简单的流水线项目:
构建后,这个基础的流水线项目已经完成 。
2、在基础流水线上的改进
pipeline {
agent any
stages {
stage('building') {
steps {
echo 'building'
}
}
stage('testing') {
steps {
echo 'testing'
}
}
stage('deploying') {
steps {
echo 'deploying'
}
}
}
}
构建后,可以看到具体步骤,就像一条流水线一样:构建——测试——部署。
实际操作时,可以根据提示来创建流水线脚本。
这里就生成了流水线脚本,将这个脚本复制后,放入流水线脚本中
构建后查看构建日志,表明已经从git中获取到构建文件。
在本地目录下也可以看到这个任务获取的文件
3、 流水线部署镜像——手动触发
流水线脚本如下:分别为拉取git——>构建镜像并推送——>在server4中部署镜像
pipeline {
agent any
stages {
stage('check out') {
steps {
git branch: 'main', credentialsId: '532f31f7-2a10-4ae8-92f5-a8a9ed0ba62f', url: 'git@172.25.254.2:root/project1.git'
}
}
stage('build image and push') {
steps {
sh '''
cd $WORKSPACE
docker build -t reg.westos.org/library/demo:${BUILD_NUMBER} .
docker login reg.westos.org -u admin -p westos
docker push reg.westos.org/library/demo:${BUILD_NUMBER}
docker tag reg.westos.org/library/demo:${BUILD_NUMBER} reg.westos.org/library/demo:latest
docker push reg.westos.org/library/demo:latest
'''
}
}
stage('docker deploy') {
steps {
sh '''
ssh -i /root/.ssh/id_rsa root@172.25.254.4 """
docker ps -a | grep myweb && docker rm -f myweb
docker rmi demo:latest
docker run -d --name myweb -p 80:80 demo:latest
"""
'''
}
}
}
}
测试:
执行完毕后,已经在server4中构建好了镜像,浏览器访问<172.25.254.4>,检查已经构建成功。
注意:
(1)构建时,server4中的</var/run/docker.sock>文件的权限必须为jenkins用户可执行,否则将会构架失败,建议设置为777。
(2)通过jenkins的agent端构建,即server5必须对server4做到免密。否则也会构建失败。
4、流水线触发——触发器自动触发
在jenkins中添加触发器后,保存:
在gitlab中添加变动通知后,保存:
测试:
更改gitlab客户端的项目文件(server2中),并推送到gitlab。
5、jenkins流水线结合钉钉报警
钉钉机器人插件,官方文档:
第一步:创建钉钉群,并添加群机器人,拿到“Webhook”地址
第二步:jenkins安装钉钉报警插件
第三步:在jenkins的系统设置中添加钉钉,完成后保存
9——上一步拿到的钉钉群的链接
10——关键字,和钉钉群里设置的机器人的关键字保持一致
添加完成后,会在钉钉群里收到机器人消息,提示绑定成功。
同时,保存后会自动在系统设置中生成机器人的ID
第四步:在devops项目脚本中添加钉钉,完成后保存退出
pipeline {
agent any
stages {
stage('check out') {
steps {
git branch: 'main', credentialsId: '532f31f7-2a10-4ae8-92f5-a8a9ed0ba62f', url: 'git@172.25.254.2:root/project1.git'
}
}
stage('build image and push') {
steps {
sh '''
cd $WORKSPACE
docker build -t reg.westos.org/library/demo:${BUILD_NUMBER} .
docker login reg.westos.org -u admin -p westos
docker push reg.westos.org/library/demo:${BUILD_NUMBER}
docker tag reg.westos.org/library/demo:${BUILD_NUMBER} reg.westos.org/library/demo:latest
docker push reg.westos.org/library/demo:latest
'''
}
}
stage('docker deploy') {
steps {
sh '''
ssh -i /root/.ssh/id_rsa root@172.25.254.4 """
docker ps -a | grep myweb && docker rm -f myweb
docker rmi demo:latest
docker run -d --name myweb -p 80:80 demo:latest
"""
'''
}
}
}
post {
success { //上线成功通知
dingtalk (
robot: 'bb9fc898-4e76-47ca-9e32-4ee358d06e25', //钉钉机器人ID,由上一步可得
type: 'TEXT',
at: ["15503671030"], //要@谁
atAll: false,
title: 'jenkins',
text: ["online success"],
hideAvatar: false
)
}
failure { //上线失败通知
dingtalk (
robot: 'bb9fc898-4e76-47ca-9e32-4ee358d06e25',
type: 'TEXT',
at: ["15503671030"],
atAll: false,
title: 'jenkins',
text: ["online failure"],
hideAvatar: false
)
}
}
}
第五步:测试,构建devops项目,在钉钉群里可以收到通知。
6、将jenkins脚本固定到gitlab中——Jenkinsfile
由于直接在jenkins中编辑脚本,不容易做版本控制及审计,因此一般将脚本以文件的格式存储在gitlab中,方便管理。
第一步:在gitlab中新建项目,并克隆到本地
第二步:git客户端编辑<Jenkinsfile>,内容上述devops项目的脚本。更改完成后提交并推送到gitlab
[root@server2 devops]# vim Jenkinsfile
[root@server2 devops]# git add Jenkinsfile
[root@server2 devops]# git commit -m "add Jenkinsfile"
[root@server2 devops]# git push -u origin main
第三步:在jenkins上更改devops配置,完成后保存
注意:取消项目之前设置的触发器。
第四步:测试: 构建完成后,在钉钉上收到构建成功的通知
基本逻辑是:
开始构建——>从gitlab中获取Jenkinsfile——>执行Jenkinsfile中的流水线步骤。
三、jenkins结合ansible批量部署apache
实验环境:在上一步实验的基础上,server1作为harbor仓库;server2作为gitlab客户端;server3作为jenkins客户端;server4和server5作为客户主机。
注意:在jenkins的节点控制上删除之前设置的server5作为agent节点,让server3既做集成交付,也作构建。
第一步:在server3上安装ansible
以<ansible-2.8.5-1.el7.noarch.rpm>为例
第二步:在gitlab上新建一个<ansible>项目,用来存放playbook。并将项目克隆到gitlab客户端
第三步:在serber2上编辑absible配置文件、对象清单和yaml文件。
分别针对两台主机列出两个清单,server4用来测试,server5用来模拟生产环境部署。
[root@server2 ansible]# cat ansible.cfg
[defaults]
command_warnings=False
remote_user=devops //指定远程主机的执行时的用户身份,不写默认为jenkins用户,但远程主机不存在jenkins用户,还是得创建
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
对象清单:
yml文件(playbook剧本)和j2模板:
[root@server2 ansible]# cat playbook.yml
---
- hosts: all
tasks:
- name: install http
yum:
name: httpd
state: present
- name: create index.html
template:
src: index.html.j2
dest: /var/www/html/index.html
- name: start httpd
service:
name: httpd
state: started
enabled: yes
[root@server2 ansible]# cat index.html.j2
{{ ansible_hostname }}
项目结构如下所示:
第四步:提交ansible项目到gitlab仓库上
第五步:在jenkins上新建<playbook>项目,完成后保存。
12——git地址为gitlab中ansible项目的克隆地址
第六步:参数化构建——仅让jenkins从gitlab上拉取项目
jenkins默认的文件存放目录为</var/lib/jenkins/workspace/>,参数化构建完成后,可以在工作目录中查看到目标gitlab项目文件,如下所示。
第七步:在server4和server5中创建devops用户并授权。
由于ansible是通过ssh远程连接用户的方式批量部署的,所以远程主机中需要存在执行命令的用户。本项目中指定远程的执行用户身份为<devops>。因此在server4/5中要新建这个用户并设置密码,并通过sudo的方式授权此用户免root密码执行所有命令。
第八步:添加server3中jenkins用户对远程主机devops用户的免密连接
第九步:更改kenjins中构建完成后的执行脚本,保存后退出。
注意:参数变量的使用
cd $WORKSPACE //进入工作目录</var/lib/jenkins/workspace/playbook> ansible-playbook -i inventory/${deploy} playbook.yml //${deploy}为上边定义的参数变量
第十步:测试
选择deploy参数中的test参数构建,查看ansible部署效果。
查看构建后的控制台输出,ansible已经在test清单中部署成功
在浏览器测试:访问<172.25.254.4>,可以看到其域名
接着选择deploy参数中的prod参数构建,查看ansible部署效果。
基本逻辑为:
1、gitlab客户端编写好ansible项目文件,并上传到gitlab服务器中
2、jenkins从gitlab中拉取ansible的项目文件到自己的工作目录下
3、拉取完成后,执行shell脚本。脚本中定义了deploy的两个参数(test和prod)清单
4、jenkins客户端以自己主机中jenkins用户的身份,通过ansible免密连接远程主机的devops用户部署httpd服务。
更多推荐
所有评论(0)