利用ansible-playbook從測試環境獲取tomcat中java項目新版本發布到生產環境

一、環境描述

安裝有ansible的服務器:192.168.13.45

測試環境服務器:192.168.13.49

/home/app/api-tomcat/webapps/api.war為測試環境新版本war包位置

生產環境服務器:192.168.13.51

/home/app/api-tomcat/webapps/api.war為生產環境war包位置
/home/app/api-tomcat/webapps/api為生產環境項目位置
/home/app/tomcat.bak/api/webapps-時間戳,為老版本webapps備份位置
/home/app/newwar/api.war為從測試環境獲得的新版本war包臨時存放位置
/home/app/newwar/api為新版本war包解壓后臨時存放的位置

全部以app用戶執行

二、編寫ansible-playbook用的yml文件

1、升級

這里所有的#開頭的注釋文字在使用的時候都要去掉,因為yml是沒有注釋的

#生產環境主機的ip,這里也可以是/etc/ansible/hosts定義的組名
- hosts: 192.168.13.51
#變量,在yml文件中使用變量可以使整個文件可以用在不同的主機上升級,變量的使用方法是{{ 變量名 }},如果task中的變量在冒號后則一定要將冒號后整句加上雙引號"",因為yml文件自動把冒號后的大括號的內容識別為列表,如shell:"{{ oldhome }}/bin/startup.sh"
  vars:
#測試環境IP地址
    testIP: 192.168.13.49
#測試環境中項目的位置
    testhome: /home/app/api-tomcat/webapps
#測試環境中項目war包的名字
    warname: api.war
#生產環境中項目的tomcat所在的位置
    oldhome: /home/app/api-tomcat
#生產環境中老版本項目所在webapps備份目錄的位置
    backupwebapps: /home/app/tomcat.bak
#從測試環境獲取的新版本war包所在的位置
    newwar: /home/app/newwar
#新版本war包解壓后目錄的名字
    zipname: api
#整個遠程自動化操作中所使用的賬戶,這里整個從生產環境到測試環境的操作都是用app用戶執行的
  remote_user: app
#具體操作
  tasks:
    - name: 生產環境刪除/home/app/newwar目錄,若目錄不存在則忽略錯誤(刪這個目錄的原因是因為之后要新建這個目錄,確保整個yml文件可以多次執行,ignore_errors為是否忽略錯誤返回值)
      file: path={{ newwar }} state=absent
      ignore_errors: yes
    - name: 生產環境創建/home/app/newwar目錄,改權限,(其中recurse是遞歸創建目錄,state是文件類型為目錄)
      file: path={{ newwar }} recurse=yes mode=775 owner=app group=app state=directory
    - name: 從測試環境192.168.13.49復制新版本/home/app/api-tomcat/webapps/api.war包到生產環境192.168.13.51的/home/app/newwar目錄下,此處之后的操作都是在生產環境下
      shell: scp app@{{ testIP }}:{{ testhome }}/{{ warname }} {{ newwar }}
    - name: 給/home/app/newwar遞歸改權限(因為整改操作都是以app用戶身份執行的,所以一定要保證權限為app的權限)
      file: dest={{ newwar}} recurse=yes mode=775 owner=app group=app
    - name: 解壓/home/app/newwar/api.war包在/home/app/newwar/api目錄
      shell: unzip -oq {{ newwar }}/{{ warname }} -d {{ newwar }}/{{ zipname }}
    - name: 再次給/home/app/newwar遞歸改權限(確保新版本為app的權限)
      file: dest={{ newwar}} recurse=yes mode=775 owner=app group=app
    - name: 創建用來備份老版本webapps的目錄/home/app/tomcat.bak/api并改遞歸權限
      file: path={{ backupwebapps }}/{{ zipname }} recurse=yes mode=775 owner=app group=app state=directory
    - name: 備份/home/app/api-tomcat/webapps到目錄/home/app/tomcat.bak/api/webapps-時間戳(這個備份目錄是用來回滾的)
      shell: cp -a {{ oldhome }}/webapps {{ backupwebapps }}/{{ zipname }}/webapps-`date +%Y%m%d%H%M`
    - name: kill進程方式停止服務.忽略錯誤返回值(用這種方式才能確保老版本停止運行,否則會出現沖突)
      shell: ps -ef | grep {{ oldhome }} | grep -v grep | xargs kill
      ignore_errors: yes
    - name: kill進程方式停止服務.忽略錯誤返回值(再次確保老版本不再運行)
      shell: ps -ef | grep {{ oldhome }} | grep -v grep | xargs kill
      ignore_errors: yes
    - name: 再次kill進程方式停止服務.忽略錯誤返回值
      shell: ps -ef | grep {{ oldhome }} | grep -v grep | xargs kill
      ignore_errors: yes
    - name: 查看停止服務的結果,進程是否還在
      shell: ps -ef | grep {{ oldhome }}
    - name: 刪除老版本的/home/app/api-tomcat/webapps/api.war包
      file: path={{ oldhome }}/webapps/{{ warname }} state=absent
      ignore_errors: yes
    - name: 刪除老版本的/home/app/api-tomcat/webapps/api程序目錄
      file: path={{ oldhome }}/webapps/{{ zipname }} state=absent
      ignore_errors: yes
    - name: 復制新版本目錄/home/app/newwar/api到/home/app/api-tomcat/webapps目錄下
      shell: cp -a {{ newwar }}/{{ zipname }} {{ oldhome }}/webapps/
    - name: 復制新版本war包/home/app/newwar/api.war包到/home/app/api-tomcat/webapps目錄下
      shell: cp -a {{ newwar }}/{{ warname }} {{ oldhome }}/webapps/
    - name: 啟動服務/home/app/api-tomcat/bin/startup.sh(source是為了載入jdk的環境變量,nohup是為了保證yml跑完了進程依然不退出)
      shell: "source /etc/profile;nohup {{ oldhome }}/bin/startup.sh &"
    - name: 查看進程中是否存在啟動的服務
      shell: ps -ef | grep {{ oldhome }}

2、回滾

#生產環境主機地址
- hosts: 192.168.13.51
#變量和升級的相同
  vars:
    testIP: 192.168.13.49
    testhome: /home/app/api-tomcat/webapps
    warname: api.war
    oldhome: /home/app/api-tomcat
    backupwebapps: /home/app/tomcat.bak
    newwar: /home/app/newwar
    zipname: api
#遠程操作依然使用app用戶
  remote_user: app
#以下操作都是在生產環境中進行
  tasks:
    - name: kill進程方式停止服務.忽略錯誤返回值
      shell: ps -ef | grep {{ oldhome }} | grep -v grep | xargs kill
      ignore_errors: yes
    - name: kill進程方式停止服務.忽略錯誤返回值
      shell: ps -ef | grep {{ oldhome }} | grep -v grep | xargs kill
      ignore_errors: yes
    - name: 再次kill進程方式停止服務.忽略錯誤返回值
      shell: ps -ef | grep {{ oldhome }} | grep -v grep | xargs kill
      ignore_errors: yes
    - name: 查看停止服務的結果.進程是否還在
      shell: ps -ef | grep {{ oldhome }}
    - name: 刪除/home/app/api-tomcat/webapps目錄
      file: path={{ oldhome }}/webapps state=absent
    - name: 顯示/home/app/tomcat.bak/api/中最新備份的webapps目錄,目錄名應該是webapps-最近時間戳
      shell: ls -r {{ backupwebapps }}/{{ zipname }} | head -1
    - name: 復制備份的/home/app/tomcat.bak/api/webapps-最新時間戳,到項目并改名/home/app/api-tomcat/webapps
      shell: cp -a {{ backupwebapps }}/{{ zipname }}/$(ls -r {{ backupwebapps }}/{{ zipname }} | head -1) {{ oldhome }}/webapps
    - name: 啟動服務/home/app/api-tomcat/bin/startup.sh
      shell: "source /etc/profile;nohup {{ oldhome }}/bin/startup.sh &"
    - name: 刪除剛才回滾的備份文件
      shell: rm -rf {{ backupwebapps }}/{{ zipname }}/$(ls -r {{ backupwebapps }}/{{ zipname }}
    - name: 查看進程中是否存在啟動的服務
      shell: ps -ef | grep {{ oldhome }}

三、升級操作和注意事項

1、升級前免密鑰操作

ansible所在主機192.168.13.45

#在app用戶下生成密鑰
ssh-keygen -t rsa
#發送公鑰到測試環境
ssh-copy-id -i .ssh/id_rsa.pub app@192.168.13.49
#發送公鑰到生產環境
ssh-copy-id -i .ssh/id_rsa.pub app@192.168.13.51

生產環境主機192.168.13.51

#在app用戶下生成密鑰
ssh-keygen -t rsa
#發送公鑰到測試環境
ssh-copy-id -i .ssh/id_rsa.pub app@192.168.13.49

為了業務安全,ansible所在主機和生產環境主機、測試環境主機是互通的。生產環境主機能連上測試環境主機,但測試環境主機不能連上生產環境主機,所以這里測試環境主機不需要將密鑰發送給生產環境主機

2、升級和回滾

升級

ansible-playbook /home/app/api.yml -v

回滾

ansible-playbook /home/app/api-rollback.yml -v

ansible-playbook后面跟上之前寫的yml文件路徑,-v是為了顯示詳細執行信息

3、注意

如果在jenkins中執行升級和回滾的yml文件,一定要將在jenkins用戶的公鑰發送給生產環境主機和測試環境主機,否則會報權限錯誤

要操作的主機一定要填入/etc/ansible/hosts中

兩個yml文件已在生產環境中驗證

原創文章,作者:N17_信風,如若轉載,請注明出處:http://www.www58058.com/64052

(1)
N17_信風N17_信風
上一篇 2016-12-18 16:58
下一篇 2016-12-18 19:09

相關推薦

  • locate、find命令使用總結

    一、簡介    在linux系統中存在"一切皆文件"的說法,這就足以說明文件的重要性,因此查找文件也是我們必須要掌握的技能。這時候熟練使用locate、find命令也就顯得至關重要。尤其是find命令常用于日常工作中如安裝完某個軟件之后要查看這些軟件的安裝配置路徑,或是需要按指定條件直接查找我們需要操作的文件。因此更需…

    Linux干貨 2015-08-31
  • 任務計劃2

    [root@localhost app]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin:/root/bin MAILTO=root   # For details see man 4 crontabs   # Example of job defi…

    Linux干貨 2017-05-15
  • Linux基礎知識(1)

    在開源的世界當中,有許多的開源協議,其中著名的有Apache、BSD和GPL協議,它們支撐了開源世界,使得讓那些開源程序變得豐富多彩,我們知道開源協定的發起人是Stallman,它主張的自由含義為自由學習和更改,自由使用;自由分發和自由創建衍生版。
    而Linux就是在這樣的開源協定下在1991年的10月份起義成功,同時,它也有它的哲學思想:

    2017-09-10
  • 高級文件系統管理2

    邏輯卷管理器(LVM),允許對卷進行方便操作的抽象層,包括重新設定文件系統的大小。允許在多個物理設備間重新組織文件系統。其步驟大體如下:將設備指定為物理卷,用一個或者多個物理卷來創建一個卷組,物理卷你是用固定大小的物理區域(PE)來定義的,在物理卷上創建的邏輯卷是由物理區域組成,可以在邏輯卷上創建文件系統。 一、知識整理 1、LVM設備名:dm-#。 軟鏈接…

    Linux干貨 2016-09-13
  • 用戶和組——Linux基本命令(10)

    1.     用戶和組的配置文件 Linux用戶和組的主要配置文件: /etc/passwd:用戶及其屬性信息(名稱、UID、主組ID等) /etc/group:組及其屬性信息 /etc/shadow:用戶密碼及其相關屬性 /etc/gshadow:組密碼及其相關屬性   2. /etc/passwd 在Li…

    2017-07-22
  • 單引號、雙引號和反引號使用方法

        首先向馬哥和馬哥團隊敬個禮,謝謝你們帶我進入Linux的世界,剛開始接觸linux時,經??吹絾我?、雙引號和反引號特殊符號,經常搞混淆和誤用,應該用雙引號,有時用到單引號。經過幾天的混亂引用,總算搞明白了一些,簡單總一下三者的使用和區別。  單引號 ‘’     單引號里的內容全部以普通字符的含義進…

    Linux干貨 2015-07-29
欧美性久久久久