记录一下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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值