jenkins-流水线【3】流水线+ansible实现java网站发布

利用 Jenkins Pipeline +Ansible Playbook 实现批量主机发布java网站

  1. gitlab服务器 ---192.168.1.112
  2. jenkins 服务器 ---192.168.1.252
  3. web服务器--192.168.1.252
  4. jenkins salve节点--192.168.1.112

只开了两台虚拟机,但是扮演不同角色,实际上思路是一样的哈。
git push ---jenkins参数化构建--任务交给salve节点运行---流水线构建(git pull ---编译构建war包---ansible-playbook部署(备份,拷贝新war包,重启tomcat操作))
只要会在jenkins的web上配置,就可以转化成pipeline 脚本用这个方式去运行。

步骤

  1. ansible链接jenkin服务器时需要的凭据,可以用片段生成器生成。前提先创建一个凭据。备注写清楚以防以后乱。


    image.png

    保存
    2.创建流水线项目。
    根据我们的步骤,大致先把 参数化构建,拉取git代码,交由salve运行 这些功能用片段生成器生成出来(流水线项目,拉到最后,点击流水线语法,选择对应功能并配置,最后点击生成代码)
    不明白选择哪个对应功能生成的参考上篇【2】


    image.png

3.剩下ansible部分。 这一块我们需要2个功能,一个是前面创建的凭据要引用。一个是读取ansible剧本yml文件,运行。

  • .凭据


    image.png
  • . ansible-playbook功能


    image.png

我只写了图中两个路径,因为机器之间做了免密,就没有选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 &

结果:


image.png

image.png

image.png
image.png

现在是手动构建,使用webhook实现自动化

jenkins安装gitlab 插件。
项目中多了一个触发器,勾选他


image.png

点击高级,生成一个token


image.png

然后到gitlab服务器,对应项目中点击webhook,填写刚才的url和token


image.png

image.png

可以测试一下。保存。
以后只要有git push 动作就会触发Jenkins构建,参数都是按默认的走。


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容