一.安装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