利用ansible來做tomcat應(yīng)用的持續(xù)交付

在做持續(xù)交付這件事,想必大家都是用jenkins這款程序來做基石。當(dāng)然,我們這次也是用jenkins作為承載工具,jenkins強(qiáng)大的插件是有目共睹的,有些ansible做起來不容易的事情交給jenkins反而簡(jiǎn)單有效。下面我會(huì)詳細(xì)說明怎么持續(xù)交付tomcat應(yīng)用。

希望本實(shí)驗(yàn)可以引導(dǎo)大家在持續(xù)交付的過程中使用ansible工具,也希望本實(shí)驗(yàn)?zāi)軒椭接行枰娜耍Mo到大家一個(gè)簡(jiǎn)單的持續(xù)交付思想和啟發(fā)。如想繼續(xù)交流的,還請(qǐng)加入QQ群:425931784。

應(yīng)用架構(gòu)


本次使用的應(yīng)用架構(gòu)是常見的負(fù)載均衡實(shí)例。

image.png

軟件版本


os: centos 6.7 X64
ansible: 2.3.1.0
python: 2.6.6
ant: 10.1
java: 1.8.0_13
tomcat: 8.5.14
jenkins: 2.73

Ansible roles


服務(wù)器角色


主機(jī) 角色
node1 nginx,jenkins
node130 tomcat
node131 tomcat

集群搭建


本次使用anisble playbook

---

- hosts: node130 node131
  vars:
   - java_version: "1.8"
   - tomcat_version: "8.5.14"
   - iptables_allowed_tcp_ports: ["8080"]
  roles:
  - java
  - { role: tomcat, java_home: "/usr/java/jdk1.8.0_131" }
  - iptables

- hosts: node1
  vars:
   - java_version: "1.8"
   - nginx_version: "1.12.1"
   - nginx_upstreams:
     - name: upstremtest
       servers:
       - 192.168.77.130:8080 max_fails=2 fail_timeout=2
       - 192.168.77.131:8080 max_fails=2 fail_timeout=2
   - nginx_vhosts:
     - listen: 80
       locations:
       - name: /
         proxy_pass: http://upstremtest
   - jenkins_version: "2.73"
   - jenkins_plugins_extra:
     - ansible
     - ansicolor
   - iptables_allowed_tcp_ports: ["80","8080"]
  roles:
  - ant
  - java
  - nginx
  - jenkins
  - iptables
  tasks:
  - name: install ansible
    package: name=ansible

怎么使用ansible roles,請(qǐng)移步到 Ansible Role【怎么用?】

確保正常訪問以下服務(wù):

node1服務(wù)器操作


在服務(wù)器上配置ansible playbook

# cd /etc/ansible/
# cat tomcat-deploy.yml
---

- hosts: all
  serial: 1
  roles:
   - deploy-tomcat

# cat hosts
[node130]
192.168.77.130

[node131]
192.168.77.131

[testservers:children]
node130
node131

[testservers:vars]
ansible_ssh_user=root
ansible_ssh_pass=123456

# git clone https://github.com/kuailemy123/Ansible-roles.git /etc/ansible/roles/
# chown jenkins.jenkins /etc/ansible/

jenkins 操作


登錄jenkins之后,設(shè)置工具
點(diǎn)擊“系統(tǒng)管理”==》“Global Tool Configuration”

image.png
image.png
image.png

創(chuàng)建發(fā)布項(xiàng)目

image.png

配置參數(shù)化構(gòu)建


image.png

配置源碼倉(cāng)庫地址


image.png

repo: https://github.com/kuailemy123/AntSpringMVC.git

配置構(gòu)建環(huán)境


image.png

配置編譯

image.png

配置ansible

image.png

配置ansible變量


image.png

這里就不配置郵件通知了。

創(chuàng)建回滾項(xiàng)目

image.png

配置參數(shù)化構(gòu)建


image.png

配置構(gòu)建環(huán)境


image.png

配置ansible

image.png

配置anisble變量
image.png

測(cè)試


執(zhí)行tomcat_deploy任務(wù)

選擇發(fā)布的節(jié)點(diǎn),默認(rèn)all

任務(wù)執(zhí)行的日志

Started by user admin
Building in workspace /var/lib/jenkins/workspace/tomcat_deploy
Cloning the remote Git repository
Cloning repository https://github.com/kuailemy123/AntSpringMVC.git
 > git init /var/lib/jenkins/workspace/tomcat_deploy # timeout=10
Fetching upstream changes from https://github.com/kuailemy123/AntSpringMVC.git
 > git --version # timeout=10
 > git fetch --tags --progress https://github.com/kuailemy123/AntSpringMVC.git +refs/heads/*:refs/remotes/origin/*
 > git config remote.origin.url https://github.com/kuailemy123/AntSpringMVC.git # timeout=10
 > git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
 > git config remote.origin.url https://github.com/kuailemy123/AntSpringMVC.git # timeout=10
Fetching upstream changes from https://github.com/kuailemy123/AntSpringMVC.git
 > git fetch --tags --progress https://github.com/kuailemy123/AntSpringMVC.git +refs/heads/*:refs/remotes/origin/*
 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision 989ea3a6549e16e3dd4cd329ab969b47658c9d67 (refs/remotes/origin/master)
Commit message: "Create README.md"
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 989ea3a6549e16e3dd4cd329ab969b47658c9d67
First time build. Skipping changelog.
[tomcat_deploy] $ ant -file build.xml -Ddeploy_node=all
Buildfile: /var/lib/jenkins/workspace/tomcat_deploy/build.xml

clean:
   [delete] Deleting directory /var/lib/jenkins/workspace/tomcat_deploy/war/WEB-INF/classes

init:
    [mkdir] Created dir: /var/lib/jenkins/workspace/tomcat_deploy/target
    [mkdir] Created dir: /var/lib/jenkins/workspace/tomcat_deploy/war/WEB-INF/classes

resolve:
     [echo] Getting dependencies...
[ivy:retrieve] :: Apache Ivy 2.4.0 - 20141213170938 :: http://ant.apache.org/ivy/ ::
[ivy:retrieve] :: loading settings :: url = jar:file:/usr/local/ant/lib/ivy-2.4.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
[ivy:retrieve] :: resolving dependencies :: org.apache#WebProject;working@node1
[ivy:retrieve]  confs: [compile, runtime, test]
[ivy:retrieve]  found org.slf4j#slf4j-api;1.7.6 in public
[ivy:retrieve]  found jstl#jstl;1.2 in public
[ivy:retrieve]  found ch.qos.logback#logback-classic;1.1.2 in public
[ivy:retrieve]  found ch.qos.logback#logback-core;1.1.2 in public
[ivy:retrieve]  found org.springframework#spring-core;4.1.3.RELEASE in public
[ivy:retrieve]  found commons-logging#commons-logging;1.2 in public
[ivy:retrieve]  found org.springframework#spring-beans;4.1.3.RELEASE in public
[ivy:retrieve]  found org.springframework#spring-context;4.1.3.RELEASE in public
[ivy:retrieve]  found org.springframework#spring-aop;4.1.3.RELEASE in public
[ivy:retrieve]  found aopalliance#aopalliance;1.0 in public
[ivy:retrieve]  found org.springframework#spring-expression;4.1.3.RELEASE in public
[ivy:retrieve]  found org.springframework#spring-web;4.1.3.RELEASE in public
[ivy:retrieve]  found org.springframework#spring-webmvc;4.1.3.RELEASE in public
[ivy:retrieve] downloading https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.6/slf4j-api-1.7.6.jar ...
[ivy:retrieve] ............ (28kB)
[ivy:retrieve] .. (0kB)
..... 省略下載的信息
[ivy:retrieve] :: resolution report :: resolve 74135ms :: artifacts dl 120701ms
    ---------------------------------------------------------------------
    |                  |            modules            ||   artifacts   |
    |       conf       | number| search|dwnlded|evicted|| number|dwnlded|
    ---------------------------------------------------------------------
    |      compile     |   13  |   13  |   13  |   0   ||   13  |   13  |
    |      runtime     |   13  |   13  |   13  |   0   ||   13  |   13  |
    |       test       |   13  |   13  |   13  |   0   ||   13  |   13  |
    ---------------------------------------------------------------------
[ivy:retrieve] :: retrieving :: org.apache#WebProject
[ivy:retrieve]  confs: [compile, runtime, test]
[ivy:retrieve]  13 artifacts copied, 0 already retrieved (5920kB/79ms)

compile:
    [javac] Compiling 1 source file to /var/lib/jenkins/workspace/tomcat_deploy/war/WEB-INF/classes
copy-resources:
     [copy] Copying 1 file to /var/lib/jenkins/workspace/tomcat_deploy/war/WEB-INF/classes
package:
[ivy:retrieve] :: retrieving :: org.apache#WebProject
[ivy:retrieve]  confs: [runtime]
[ivy:retrieve]  0 artifacts copied, 13 already retrieved (0kB/5ms)
      [war] Building war: /var/lib/jenkins/workspace/tomcat_deploy/target/helloproject-20170819172002.war

main:

BUILD SUCCESSFUL
Total time: 3 minutes 19 seconds
[tomcat_deploy] $ /usr/bin/ansible-playbook /etc/ansible/tomcat-deploy.yml -i /etc/ansible/hosts -l all -f 5 -e deploy_port=8080 -e deploy_file=/var/lib/jenkins/workspace/tomcat_deploy/target/helloproject-*.war

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.77.130]

TASK [deploy-tomcat : check | 發(fā)布文件是否存在] ****************************************
ok: [192.168.77.130]

TASK [deploy-tomcat : check | 目標(biāo)應(yīng)用服務(wù)的家目錄是否存在] **********************************
ok: [192.168.77.130]

TASK [deploy-tomcat : check | 工作目錄如果不存在則創(chuàng)建] ************************************
changed: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/new)
changed: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/pre)
changed: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/old)

TASK [deploy-tomcat : deloy | 解壓代碼至目標(biāo)服務(wù)器] **************************************
changed: [192.168.77.130]

TASK [deploy-tomcat : deloy | 關(guān)閉服務(wù)] ********************************************
changed: [192.168.77.130]

TASK [deploy-tomcat : deloy | 等待端口關(guān)閉] ******************************************
ok: [192.168.77.130]

TASK [deploy-tomcat : deloy | 移動(dòng)線上代碼] ******************************************
changed: [192.168.77.130]

TASK [deploy-tomcat : deloy | 部署最新代碼] ******************************************
changed: [192.168.77.130]

TASK [deploy-tomcat : deloy | 啟動(dòng)服務(wù)] ********************************************
changed: [192.168.77.130]

TASK [deploy-tomcat : deloy | 等待端口開啟] ******************************************
ok: [192.168.77.130]

TASK [deploy-tomcat : verify | 查看http狀態(tài).] **************************************
ok: [192.168.77.130]

TASK [deploy-tomcat : backup | 創(chuàng)建存儲(chǔ)備份的文件夾] *************************************
changed: [192.168.77.130]

TASK [deploy-tomcat : backup | 備份上線的代碼] ****************************************
changed: [192.168.77.130]

TASK [deploy-tomcat : rollback | 檢查/tmp/tomcat-ansible-snap/old是否存在代碼] *********
skipping: [192.168.77.130]

TASK [deploy-tomcat : rollback | 關(guān)閉服務(wù)] *****************************************
skipping: [192.168.77.130]

TASK [deploy-tomcat : rollback | 等待端口關(guān)閉] ***************************************
skipping: [192.168.77.130]

TASK [deploy-tomcat : rollback | 部署上一版代碼] **************************************
skipping: [192.168.77.130]

TASK [deploy-tomcat : rollback | 啟動(dòng)服務(wù)] *****************************************
skipping: [192.168.77.130]

TASK [deploy-tomcat : rollback | 等待端口開啟] ***************************************
skipping: [192.168.77.130]

TASK [deploy-tomcat : verify | 查看http狀態(tài).] **************************************
skipping: [192.168.77.130]

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.77.131]

TASK [deploy-tomcat : check | 發(fā)布文件是否存在] ****************************************
ok: [192.168.77.131]

TASK [deploy-tomcat : check | 目標(biāo)應(yīng)用服務(wù)的家目錄是否存在] **********************************
ok: [192.168.77.131]

TASK [deploy-tomcat : check | 工作目錄如果不存在則創(chuàng)建] ************************************
ok: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/new)
ok: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/pre)
ok: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/old)

TASK [deploy-tomcat : deloy | 解壓代碼至目標(biāo)服務(wù)器] **************************************
changed: [192.168.77.131]

TASK [deploy-tomcat : deloy | 關(guān)閉服務(wù)] ********************************************
changed: [192.168.77.131]

TASK [deploy-tomcat : deloy | 等待端口關(guān)閉] ******************************************
ok: [192.168.77.131]

TASK [deploy-tomcat : deloy | 移動(dòng)線上代碼] ******************************************
changed: [192.168.77.131]

TASK [deploy-tomcat : deloy | 部署最新代碼] ******************************************
changed: [192.168.77.131]

TASK [deploy-tomcat : deloy | 啟動(dòng)服務(wù)] ********************************************
changed: [192.168.77.131]

TASK [deploy-tomcat : deloy | 等待端口開啟] ******************************************
ok: [192.168.77.131]

TASK [deploy-tomcat : verify | 查看http狀態(tài).] **************************************
ok: [192.168.77.131]

TASK [deploy-tomcat : backup | 創(chuàng)建存儲(chǔ)備份的文件夾] *************************************
changed: [192.168.77.131]

TASK [deploy-tomcat : backup | 備份上線的代碼] ****************************************
changed: [192.168.77.131]

TASK [deploy-tomcat : rollback | 檢查/tmp/tomcat-ansible-snap/old是否存在代碼] *********
skipping: [192.168.77.131]

TASK [deploy-tomcat : rollback | 關(guān)閉服務(wù)] *****************************************
skipping: [192.168.77.131]

TASK [deploy-tomcat : rollback | 等待端口關(guān)閉] ***************************************
skipping: [192.168.77.131]

TASK [deploy-tomcat : rollback | 部署上一版代碼] **************************************
skipping: [192.168.77.131]

TASK [deploy-tomcat : rollback | 啟動(dòng)服務(wù)] *****************************************
skipping: [192.168.77.131]

TASK [deploy-tomcat : rollback | 等待端口開啟] ***************************************
skipping: [192.168.77.131]

TASK [deploy-tomcat : verify | 查看http狀態(tài).] **************************************
skipping: [192.168.77.131]

PLAY RECAP *********************************************************************
192.168.77.130             : ok=14   changed=8    unreachable=0    failed=0   
192.168.77.131             : ok=14   changed=7    unreachable=0    failed=0   

Finished: SUCCESS

執(zhí)行tomcat_rollback任務(wù)

image.png

選擇回滾的節(jié)點(diǎn),默認(rèn)all

執(zhí)行的日志

Started by user admin
Building in workspace /var/lib/jenkins/workspace/tomcat_rollback
[tomcat_rollback] $ /usr/bin/ansible-playbook /etc/ansible/tomcat-deploy.yml -i /etc/ansible/hosts -l all -f 5 -e deploy_rollback=true

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.77.130]

TASK [deploy-tomcat : check | 發(fā)布文件是否存在] ****************************************
skipping: [192.168.77.130]

TASK [deploy-tomcat : check | 目標(biāo)應(yīng)用服務(wù)的家目錄是否存在] **********************************
skipping: [192.168.77.130]

TASK [deploy-tomcat : check | 工作目錄如果不存在則創(chuàng)建] ************************************
skipping: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/new) 
skipping: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/pre) 
skipping: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/old) 

TASK [deploy-tomcat : deloy | 解壓代碼至目標(biāo)服務(wù)器] **************************************
skipping: [192.168.77.130]

TASK [deploy-tomcat : deloy | 關(guān)閉服務(wù)] ********************************************
skipping: [192.168.77.130]

TASK [deploy-tomcat : deloy | 等待端口關(guān)閉] ******************************************
skipping: [192.168.77.130]

TASK [deploy-tomcat : deloy | 移動(dòng)線上代碼] ******************************************
skipping: [192.168.77.130]

TASK [deploy-tomcat : deloy | 部署最新代碼] ******************************************
skipping: [192.168.77.130]

TASK [deploy-tomcat : deloy | 啟動(dòng)服務(wù)] ********************************************
skipping: [192.168.77.130]

TASK [deploy-tomcat : deloy | 等待端口開啟] ******************************************
skipping: [192.168.77.130]

TASK [deploy-tomcat : verify | 查看http狀態(tài).] **************************************
skipping: [192.168.77.130]

TASK [deploy-tomcat : backup | 創(chuàng)建存儲(chǔ)備份的文件夾] *************************************
skipping: [192.168.77.130]

TASK [deploy-tomcat : backup | 備份上線的代碼] ****************************************
skipping: [192.168.77.130]

TASK [deploy-tomcat : rollback | 檢查/tmp/tomcat-ansible-snap/old是否存在代碼] *********
changed: [192.168.77.130]

TASK [deploy-tomcat : rollback | 關(guān)閉服務(wù)] *****************************************
changed: [192.168.77.130]

TASK [deploy-tomcat : rollback | 等待端口關(guān)閉] ***************************************
ok: [192.168.77.130]

TASK [deploy-tomcat : rollback | 部署上一版代碼] **************************************
changed: [192.168.77.130]

TASK [deploy-tomcat : rollback | 啟動(dòng)服務(wù)] *****************************************
fatal: [192.168.77.130]: FAILED! => {"changed": true, "cmd": "/etc/init.d/tomcat start", "delta": "0:00:20.035003", "end": "2017-08-19 17:24:47.586469", "failed": true, "rc": 1, "start": "2017-08-19 17:24:27.551466", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring

TASK [deploy-tomcat : rollback | 等待端口開啟] ***************************************
ok: [192.168.77.130]

TASK [deploy-tomcat : verify | 查看http狀態(tài).] **************************************
ok: [192.168.77.130]

PLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [192.168.77.131]

TASK [deploy-tomcat : check | 發(fā)布文件是否存在] ****************************************
skipping: [192.168.77.131]

TASK [deploy-tomcat : check | 目標(biāo)應(yīng)用服務(wù)的家目錄是否存在] **********************************
skipping: [192.168.77.131]

TASK [deploy-tomcat : check | 工作目錄如果不存在則創(chuàng)建] ************************************
skipping: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/new) 
skipping: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/pre) 
skipping: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/old) 

TASK [deploy-tomcat : deloy | 解壓代碼至目標(biāo)服務(wù)器] **************************************
skipping: [192.168.77.131]

TASK [deploy-tomcat : deloy | 關(guān)閉服務(wù)] ********************************************
skipping: [192.168.77.131]

TASK [deploy-tomcat : deloy | 等待端口關(guān)閉] ******************************************
skipping: [192.168.77.131]

TASK [deploy-tomcat : deloy | 移動(dòng)線上代碼] ******************************************
skipping: [192.168.77.131]

TASK [deploy-tomcat : deloy | 部署最新代碼] ******************************************
skipping: [192.168.77.131]

TASK [deploy-tomcat : deloy | 啟動(dòng)服務(wù)] ********************************************
skipping: [192.168.77.131]

TASK [deploy-tomcat : deloy | 等待端口開啟] ******************************************
skipping: [192.168.77.131]

TASK [deploy-tomcat : verify | 查看http狀態(tài).] **************************************
skipping: [192.168.77.131]

TASK [deploy-tomcat : backup | 創(chuàng)建存儲(chǔ)備份的文件夾] *************************************
skipping: [192.168.77.131]

TASK [deploy-tomcat : backup | 備份上線的代碼] ****************************************
skipping: [192.168.77.131]

TASK [deploy-tomcat : rollback | 檢查/tmp/tomcat-ansible-snap/old是否存在代碼] *********
changed: [192.168.77.131]

TASK [deploy-tomcat : rollback | 關(guān)閉服務(wù)] *****************************************
changed: [192.168.77.131]

TASK [deploy-tomcat : rollback | 等待端口關(guān)閉] ***************************************
ok: [192.168.77.131]

TASK [deploy-tomcat : rollback | 部署上一版代碼] **************************************
changed: [192.168.77.131]

TASK [deploy-tomcat : rollback | 啟動(dòng)服務(wù)] *****************************************
changed: [192.168.77.131]

TASK [deploy-tomcat : rollback | 等待端口開啟] ***************************************
ok: [192.168.77.131]

TASK [deploy-tomcat : verify | 查看http狀態(tài).] **************************************
ok: [192.168.77.131]

PLAY RECAP *********************************************************************
192.168.77.130             : ok=8    changed=4    unreachable=0    failed=0   
192.168.77.131             : ok=8    changed=4    unreachable=0    failed=0   

Finished: SUCCESS

至此,持續(xù)交付實(shí)驗(yàn)就完成了,但是持續(xù)之路還是很漫長(zhǎng)了。望大家永遠(yuǎn)前進(jìn)。 大家也可在發(fā)的過程中,測(cè)試發(fā)布是否是灰度發(fā)布。

for i in `seq 10000`;do curl -s -I http://192.168.77.129 | head -1;sleep 1;done;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 什么是Ansible,它有什么用? Ansible它是個(gè)集配置管理和應(yīng)用部署于一體的自動(dòng)化運(yùn)維工具。 應(yīng)用情...
    午覺不眠Orz閱讀 1,731評(píng)論 0 0
  • ## Topic: playbook 基本語法和常用命令# State:# 1. Ansible pla...
    Michael_林閱讀 5,327評(píng)論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評(píng)論 19 139
  • ansible 系統(tǒng)架構(gòu) ansible簡(jiǎn)介ansible是新出現(xiàn)的自動(dòng)化運(yùn)維工具,ansible是一個(gè)配置管理和...
    運(yùn)維阿文閱讀 9,853評(píng)論 1 53
  • 做吃的應(yīng)該就只是食品專業(yè)、烹飪專業(yè)學(xué)生的專利了吧。先上圖 昨天的肉品工藝實(shí)驗(yàn)課上,學(xué)姐帶我們一塊下手做了這道美味的...
    做夢(mèng)小富婆閱讀 1,244評(píng)論 0 0

友情鏈接更多精彩內(nèi)容