利用 Jenkins Pipeline +Ansible Playbook 实现批量主机发布java网站
- gitlab服务器 ---192.168.1.112
- jenkins 服务器 ---192.168.1.252
- web服务器--192.168.1.252
- jenkins salve节点--192.168.1.112
只开了两台虚拟机,但是扮演不同角色,实际上思路是一样的哈。
git push ---jenkins参数化构建--任务交给salve节点运行---流水线构建(git pull ---编译构建war包---ansible-playbook部署(备份,拷贝新war包,重启tomcat操作))
只要会在jenkins的web上配置,就可以转化成pipeline 脚本用这个方式去运行。
步骤
-
ansible链接jenkin服务器时需要的凭据,可以用片段生成器生成。前提先创建一个凭据。备注写清楚以防以后乱。
保存
2.创建流水线项目。
根据我们的步骤,大致先把 参数化构建,拉取git代码,交由salve运行 这些功能用片段生成器生成出来(流水线项目,拉到最后,点击流水线语法,选择对应功能并配置,最后点击生成代码)
不明白选择哪个对应功能生成的参考上篇【2】
3.剩下ansible部分。 这一块我们需要2个功能,一个是前面创建的凭据要引用。一个是读取ansible剧本yml文件,运行。
-
.凭据
-
. ansible-playbook功能
我只写了图中两个路径,因为机器之间做了免密,就没有选ssh秘钥。最终生成代码。复制到steps块
主机清单和剧本内容采用cat EOF的方式输出到文件。
完整代码:
pipeline {
agent {
label '112'
}
parameters {
gitParameter branch: '', branchFilter: '.*', defaultValue: 'master', description: '你选择的分支?', name: 'branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'PT_BRANCH'
choice choices: ['java', 'java2', 'java3'], description: '选择发布的主机组', name: 'host_group'
}
stages {
stage('拉取git代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '$branch']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'd386c248-cf59-45c5-9731-b8f2d42411e9', url: 'http://192.168.1.112:85/webservice/java_web.git']]])
}
}
stage('编译构建') {
steps {
sh label: '', script: 'mvn clean package -Dmaven.test.skip=true'
}
}
stage('项目测试') {
steps {
echo 'Java Web Project Test is Suessful '
}
}
stage('拷贝构建文件到远程主机') {
steps {
withCredentials([usernamePassword(credentialsId: 'dee60f63-fcf8-405b-a199-55b53ea2b9f6', passwordVariable: 'password', usernameVariable: 'username')]) {
// some block
sh """
#######################################主机清单文件##############################################
cat >/opt/jenkins_home/.hosts <<EOF
[java]
192.168.1.252
[java2]
192.168.1.252
[java3]
192.168.1.252
EOF
######################################Playbook文件################################################
cat >/opt/jenkins_home/.playbook.yml << EOF
- hosts: $host_group
vars:
workspace: $WORKSPACE
tomcat_dir: /usr/local/tomcat
tasks:
- name: scp war package
copy: src="{{item}}" dest=/tmp/ROOT.war
with_fileglob:
- "{{ workspace }}/target/*.war"
- name: Backup java file
tags: bk
shell: cd {{ tomcat_dir }}/webapps && mv ROOT.war /data/backup/ROOT_\$(date +%F_%T).war
- name: Bushu war and resstart tomcat service
tags: bushu
shell:
mv /tmp/ROOT.war {{ tomcat_dir }}/webapps/ROOT.war &&
cd {{ tomcat_dir }} &&
/bin/sh -x restart.sh
EOF
"""
}
ansiblePlaybook inventory: '/opt/jenkins_home/.hosts', playbook: '/opt/jenkins_home/.playbook.yml'
}
}
}
}
$host_group 是参数化那选择的变量
$WORKSPACE 是jenkins工作目录内置变量
vars 部分声明的变量属于ansible的变量。
注意:关于shell的变量 要在这里直接用$ 引用会报错。要转义\,不过做的过程中我转义了还是会各种报错
不识别shell变量,干脆直接把重启tomcat服务的部分写成.shell脚本到远程服务器的tomcat路径下,直接执行。
[root@server-1 tomcat]# pwd
/usr/local/tomcat
[root@server-1 tomcat]# cat restart.sh
#!/bin/bash
pid=$(ps -ef|grep tomcat|grep -v 'grep'|awk '{print $2}')| cat #加cat 是让ansible rc状态为0,不然因状态码非零会报错
[ -n "$pid" ] && kill -9 $pid &&
nohup /usr/local/tomcat/bin/startup.sh &>/dev/null &
结果:
现在是手动构建,使用webhook实现自动化
jenkins安装gitlab 插件。
项目中多了一个触发器,勾选他
点击高级,生成一个token
然后到gitlab服务器,对应项目中点击webhook,填写刚才的url和token
可以测试一下。保存。
以后只要有git push 动作就会触发Jenkins构建,参数都是按默认的走。