一.安装ansible插件并生成对应插件的语法

新建项目(流水线)---->配置---->最下面流水线语法

1.生成ansible远程连接要部署web服务器的用户名和密码认证语法

2.生成选项参数语法

3.生成连接Jenkins服务器用户名和密码语法

二.配置流水线脚本

pipeline {
agent {
label "task1"
}
environment {
git_address = "http://gitlab.ctnrs.com/my-group/ansible.git"
git_password = "4cfc8d8f-489b-4c29-9f10-4a1b265e0cb3"
ansible_ssh_auth = "a14ad8a7-5ad6-43de-bac6-221000c8015c"
}
parameters {
gitParameter branch: '', branchFilter: '.*', defaultValue: 'master', description: '请选择你要发布的分支', name: 'branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'PT_BRANCH'
choice choices: ['webservers1', 'webservers2', 'webservers3'], description: '''灰度发布策略,分批次部署
webservers1
192.168.0.2
192.168.0.5
webservers2
192.168.0.2
webservers3
192.168.0.5''', name: 'ENV'
}

triggers {
pollSCM '*/1 * * * * '
}
stages {
stage('拉取代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: "${params.branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "$git_password", url: "$git_address"]]])
}
}
stage('编译构建') {
steps {
sh "/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true"
}
}
stage('拷贝构建文件到远程主机并部署') {
steps {
// 读取连接Jenkins服务器用户名和密码
withCredentials([usernamePassword(credentialsId: '911fbe26-312f-4959-9fd1-a9799cafe4c5', passwordVariable: 'password', usernameVariable: 'username')]) {
// ===========================================
sh """
###################### 主机清单文件 ############################
cat > /opt/jenkins/.hosts << EOF
[webservers1]
192.168.0.2
192.168.0.5
[webservers2]
192.168.0.2
[webservers3]
192.168.0.5
EOF
###################### Playbook文件 ############################
cat > /opt/jenkins/.playbook.yaml << "EOF"
- hosts: $ENV # Jenkins参数化变量
gather_facts: no
vars: # 定义playbook变量,下面{{}}引用这里的变量
workspace: $WORKSPACE # WORKSPACE和BUILD_NUMBER引用Jenkins变量
build_number: $BUILD_NUMBER
tomcat_dir: "/usr/local/tomcat" # 自定义变量
backup_dir: "/data/backup"
backup_filename: "demo-ROOT-\$(date +%F)-{{ build_number }}.war" # 格式:项目名-文件名-日期-构建编号
tasks:
- name: 推送部署包到远程服务器
copy: src="{{ item }}" dest={{ tomcat_dir }}/webapps
with_fileglob:
- "{{ workspace }}/target/*.war"
- name: 部署新程序并重启Tomcat
# 脚本中\$必须转义,否则会认为是Jenkins变量
shell: |
cd {{ tomcat_dir }}/webapps
mv ROOT.war {{ backup_dir }}/{{ backup_filename }}
mv *.war ROOT.war
pid=\$(ps -ef |grep {{ tomcat_dir }} |egrep -v 'grep' |awk '{print \$2}')
[ -n "\$pid" ] && kill -9 \$pid
export JAVA_HOME=/usr/local/jdk
nohup {{ tomcat_dir }}/bin/startup.sh
EOF
"""
// ===========================================
}
ansiblePlaybook(
playbook: '/opt/jenkins/.playbook.yaml',
inventory: '/opt/jenkins/.hosts',
credentialsId: "${ansible_ssh_auth}"
)
}
}
}
}

三.验证访问

1.发布webservers1组服务器部署

访问tomcat web服务器1

192.168.0.2:8080

访问tomcat web服务器2

192.168.0.5:8080

2.发布webservers2组服务器部署

#修改页面代码

vim java-demo/src/main/resources/templates/index.ftl

git add .

git commit -m “demo”

git push origin master

访问tomcat web服务器1,查看tomcat web服务器2是否变化

192.168.0.2:8080

3.发布webservers3组服务器部署

访问tomcat web服务器

#修改页面代码

vim java-demo/src/main/resources/templates/index.ftl

git add .

git commit -m “demo2”

git push origin master

访问tomcat web2服务器,查看tomcat web服务器1是否变化

192.168.0.5:8080