记录一下ansible更新java服务的通用脚本

    技术2022-07-10  138

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

     

    Processed: 0.010, SQL: 9