記錄一下ansible更新java服務的通用腳本

記錄一下ansible更新java服務的通用腳本

需求:十多個環境,而都是使用systemd進行管理,jar包路徑不定,更新模塊數量也不定,更新主機也不定

腳本功能:使用ansible進行傳包操作,重啓服務

Jenkins變量賦值
通過變量的替換,達到一個腳本多個環境的使用

腳本內容: 

#!/bin/bash
# 遇到錯誤就退出
set -e

# 判斷變量是否賦值
[ ! "$module_dir" ] && echo -e "\033[31m module_dir變量沒有設置 \033[0m" && exit 1 

[ ! "$dest_jar_path" ] && echo -e "\033[31m dest_jar_path變量沒有設置 \033[0m" && exit 1 

[ ! "$service" ] && echo -e "\033[31m service變量沒有設置 \033[0m" && exit 1 

[ ! "$port" ] && echo -e "\033[31m port變量沒有設置 \033[0m" && exit 1 

# 將變量賦值給數組
dest_jar_path=(${dest_jar_path})
module_dir=(${module_dir})
service=(${service})
port=(${port})

# 設置睡眠時間 單位:秒
sleep_time=10

# 獲取數組的長度
index="${#module_dir[*]}"

# 循環次數 = 數組長度 最後一次因數組沒值,則不執行
for index in `seq 0 $index`
do
  # 用來顯示正在更新第幾個模塊
  let module_length=$index+1
  
  # 使用for循環,取到module_dir的值
  for module_dir in ${module_dir[$index]}
  do
    # cd到對應模塊的路徑
    cd ${WORKSPACE}/${module_dir}
    # 查找出對應的src_jar包路徑
    src_jar_path=$(find ./ -name *[0-9]*.jar -type f | egrep -v '\<common\>|\<client\>' | grep 'exec.jar' | sed 's#\(.*\)/\(.*\)-[0-9]#\0#g')
    # 取目標jar包存放路徑
    for dest_jar_path in ${dest_jar_path[$index]}
    do
      # 使用synchronize模塊,將jar包傳到目標路徑
      echo -e "\033[32m 第${module_length}個模塊,正在傳輸${dest_jar_path}到目標服務器 \033[0m"
      ansible $hosts -m synchronize -a "src=${src_jar_path} dest=${dest_jar_path} checksum=yes compress=yes"
      echo -e "\033[32m 第${module_length}個模塊,傳輸${dest_jar_path}已完成 \033[0m"
    done
  done


  # 停止指定服務
  for stop_service in ${service[$index]}
  do
    echo -e "\033[32m 第${module_length}個模塊,準備停止${stop_service}服務 \033[0m"
    ansible $hosts -m service -a "name=${stop_service} state=stopped"
    echo -e "\033[32m 第${module_length}個模塊,${stop_service}服務已停止 \033[0m"
    # 停止${sleep_time}秒
    echo -e "\033[32m 第${module_length}個模塊,準備睡眠${sleep_time}秒 \033[0m"
    ansible ${hosts} -m pause -a "seconds=${sleep_time}"
    echo -e "\033[32m 第${module_length}個模塊,睡眠${sleep_time}秒結束 \033[0m"
  done

  # 判斷端口是否已經關閉
  for port_stop in ${port[$index]}
  do
    echo -e "\033[32m 第${module_length}個模塊,準備驗證${port_stop}端口是否關閉 \033[0m"
    ansible ${hosts} -m wait_for -a "port=${port_stop} delay=3 state=stopped timeout=60"
    echo -e "\033[32m 第${module_length}個模塊,${port_stop}端口已關閉 \033[0m"
  done

  # 重啓指定服務
  for restart_service in ${service[$index]}
  do
    echo -e "\033[32m 第${module_length}個模塊,準備重啓${restart_service}服務 \033[0m"
    ansible $hosts -m service -a "name=${restart_service} state=restarted"
    echo -e "\033[32m 第${module_length}個模塊,${restart_service}服務已重啓 \033[0m"
    # 停止${sleep_time}秒
    echo -e "\033[32m 第${module_length}個模塊,準備睡眠${sleep_time}秒 \033[0m"
    ansible ${hosts} -m pause -a "seconds=${sleep_time}"
    echo -e "\033[32m 第${module_length}個模塊,睡眠${sleep_time}秒結束 \033[0m"
  done

  # 判斷端口是否已經啓動
  for port_start in ${port[$index]}
  do
    echo -e "\033[32m 第${module_length}個模塊,準備驗證${port_start}端口是否啓動 \033[0m"
    ansible ${hosts} -m wait_for -a "port=${port_start} delay=3 timeout=60"
    echo -e "\033[32m 第${module_length}個模塊,${port_start}端口已啓動 \033[0m"
  done

  #判斷端口的HTTP狀態碼是否500
  for port in ${port[$index]}
  do
    echo -e "\033[32m 第${module_length}個模塊,準備驗證${port}端口的HTTP狀態碼 \033[0m"
    # curl 獲取HTTP的狀態碼 重試5次 延時6秒,如果30秒HTTP狀態碼等於500,就退出,並且打印錯誤提示,然後返回錯誤碼爲<1>
    ansible ${hosts} -m shell -a "while true;do if [ $(curl -sIL --retry 5 --retry-delay 6 -w "%{http_code}" -o /dev/null localhost:${port}) != 500 ];then exit 0;else echo -e '\033[32m 第${module_length}個模塊,驗證${port}端口的HTTP狀態碼出錯 \033[0m\n ' && exit 1;fi;done"
    echo -e "\033[32m 第${module_length}個模塊,驗證${port}端口的HTTP狀態碼成功 \033[0m"
  done

  # 輸出更新完成
  for index in ${module_dir[$index]}
  do
    echo -e "\033[32m 第${module_length}個模塊,更新完成 \033[0m"
    echo -e "\033[32m ------------------------------------- \033[0m"
  done
done

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章