Shell -- 通过AWS cli 和 targets_group 做流量切换部署脚本(长连接服务)
1 #!/bin/bash 2 3 who am i 4 # 部署jar包通过cli的形式 5 set -x 6 7 #获取线上服务端口 8 PORT=$2 9 10 15 16 # 负载均衡目标组ID:register-targets 17 targets_arn="arn:aws:xxxxxxxx/elbwan-prod-mqtt-001/75dd805801b1fdce" 18 19 # 获取要部署的主机IP 20 #HOST_LIST=($(echo $HOST)) 21 22 #项目名 23 REMOTE_PROJECT=$1 24 25 #远程JAR包存放目录 26 REMOTE_JARDIR=/apps/project/${REMOTE_PROJECT} 27 28 29 #远程执行用户 30 REMOTEUSER='co_dev' 31 32 # 服务器列表新增服务器都在这里面添加,因为aws ELB network loadbalance 的目标群组是instance的形式,不能通过IP的形式挂载/摘取机器所以自己建立了对应关系表 33 list[1]="prod1,i-0dae45bcc2d4f77ad,10.78.5.55" 34 list[2]="prod2,i-05c517e7856ef6f76,10.78.7.172" 35 36 37 # 查看要部署的机器 38 echo ${list[@]} 39 40 # 函数获取进程pid 41 jarpid () { 42 JAR_pid=`ssh ${REMOTEUSER}@${IP} ps -ef | grep "${REMOTE_JARDIR}/${REMOTE_PROJECT}.jar" | grep -v "grep"|awk '{print $2}'` 43 if [ -z "$JAR_pid" ] ; then break ;fi 44 } 45 ENV=`echo "$name"| awk -F ',' '{print $1}'` 46 ID=`echo "$name"| awk -F ',' '{print $2}'` 47 IP=`echo "$name"| awk -F ',' '{print $3}'` 48 49 # 获取编译后的包名 50 PACKAGE=`find ./ -name ${REMOTE_PROJECT}.jar` 51 52 # 从ELB找出负载均衡机器 53 /root/.local/bin/aws elbv2 deregister-targets --target-group-arn $targets_arn --targets Id=$ID 54 if [ $? -eq 0 ];then 55 i=1 56 while [[ $i < 5 ]] 57 do 58 jarpid 59 if [[ $i -eq 4 ]];then 60 ssh ${REMOTEUSER}@${IP} "kill -9 $JAR_pid" 61 break 62 fi 63 64 ssh ${REMOTEUSER}@${IP} "kill -15 $JAR_pid" 65 jarpid 66 sleep 10 67 let i++ 68 done 69 else 70 echo “ELB 摘除机器失败,请检查” 71 exit 4 72 fi 73 74 75 # 远程主机备份.jar 包跟新新版本.jar包并启动 76 scp $PACKAGE ${REMOTEUSER}@${IP}:$REMOTE_JARDIR/${REMOTE_PROJECT}.jar 77 if [ $? -eq 0 ];then 78 jar_number=`ssh ${REMOTEUSER}@${IP} find /apps/project/${REMOTE_PROJECT} -name ${REMOTE_PROJECT}.jar | wc -l` 79 if [ $jar_number -ge 1 ];then 80 echo "${REMOTE_PROJECT}.jar 版本包已经cp 到${REMOTE_PROJECT}/bin 目录下,可以正常器启动${REMOTE_PROJECT}项目" 81 else 82 echo "${REMOTE_PROJECT}.jar No such file or directory 可能maven编译失败,请检查" 83 exit 2 84 fi 85 else 86 echo "${REMOTE_PROJECT}.jar No such file or directory 远程更新jar 失败" 87 exit 1 88 fi 89 90 91 # 启动jar 服务并检查端口 92 sleep 2 93 echo ".......................................开始启动$REMOTE_PROJECT 服务" 94 ssh ${REMOTEUSER}@${IP} "nohup /apps/sofe/jdk1.8.0_131/bin/java -jar -Xms13g -Xmx13g -Xss512k -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:NewSize=11g -XX:MaxNewSize=11g -XX:SurvivorRatio=18 -XX:MaxDirectMemorySize=2g -XX:+UseParNewGC -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=15 -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+ScavengeBeforeFullGC -XX:+CMSScavengeBeforeRemark -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:-CMSClassUnloadingEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-ReduceInitialCardMarks -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:-HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/apps/logs/grab_cycle_mqttserver/HeapDumpOnOutOfMemoryError -Dio.netty.allocator.type=pooled -Dspring.profiles.active="$ENV" ${REMOTE_JARDIR}/${REMOTE_PROJECT}.jar >>/apps/project/${REMOTE_PROJECT}/${REMOTE_PROJECT}.log 2>&1 &" 95 sleep 10 96 java_pid=`ssh $REMOTEUSER@$IP ps -ef | grep "${REMOTE_JARDIR}/$REMOTE_PROJECT" | egrep -v "grep"|wc -l` 97 if [[ $java_pid -ge 1 ]];then 98 echo "${REMOTE_PROJECT} startup is successful" 99 else 100 echo "${REMOTE_PROJECT} startup is filed" 101 exit 3 102 fi 103 104 # 从负载均衡器注册目标主机 105 /root/.local/bin/aws elbv2 register-targets --target-group-arn $targets_arn --targets Id=$ID 106 if [ $? -eq 0 ];then 107 echo "${IP} 服务器 ${REMOTE_PROJECT} 项目部署完毕.等待4分钟注册操作下一台机器..................................." 108 echo -e "\n\n\n" 109 sleep 180 110 else 111 echo "${IP} 主机注册负载均衡失败" 112 exit 5 113 fi 114 115 done