linux 平台实现 web 服务器的自动化发布 (纯shell 版本,存在ssh 不能自动退出问题,待解决)

转至:https://www.cnblogs.com/vmsky/p/13824172.html

背景说明

1、集团OA系统上线,web App 部署在6台服务器中,因项目初期,每次更新都需要进行大量的部署操作。操作费事费力部署,还容易出错,且缺乏通知机制。针对这一现状,计划通过脚本来实现半自动化的发布工作(因为无法解决自动化打包问题,只能采用半自动化方式了)

一:环境说明

  1. OS:RHL 7.2
  2. 中间件: tomcat 7.0

二、开发语言:

  1. linux Shell
  2. Python 3.7

三、服务器分布

PRDAPPvlxcndsz01ekpp1
PRD APP vlxcndsz01ekpp2
PRD APP vlxcndsz01ekpp3
PRD APP vlxcndsz01ekpp4
PRD APP vlxcndsz01ekpp5
PRD APP vlxcndsz01ekpp6 (执行部署脚本)四、环境准备

四、思路

1、从其中一台服务器远程到,挨个轮询到对应服务器,调用服务器shell 命令完成应用部署。

五、基础环境准备

1、服务器免登陆配置 参见https://www.cnblogs.com/vmsky/p/13726955.html

2、软件包存放在共享目录

六、linux shell 代码

#!/bin/bash
#mkdir /deploy/tmp/EKP
#Node List ,存放用用服务器,IP地址用空格分割
PRD_LIST=" 10.196.71.8 10.196.71.13 "
#Shell Env,存放于bamboo 服务器vim
SHELL_NAME=$0
SHELL_DIR="/data/EKP_Attachment"
SHELL_LOG="${SHELL_DIR}/DeployShell/logs/${SHELL_NAME}.log"
 
#Code Env,存放于bamboo 服务器
PRO_NAME="ekp"
# CODE_DIR="/deploy/code/${PRO_NAME}" #代码存放路径,每次更新前同步仓库最新的代码
# CONFIG_DIR="/deploy/config/$PRO_NAME" #该目录下的base目录用于存放最基础的代码的配置文件
# TMP_DIR="/deploy/tmp"
# TAR_DIR="/deploy/tar/$PRO_NAME"
LOCK_FILE="${SHELL_DIR}/DeployShell/tmp/$0.lock" #用于判定当前脚本是否在运行

Keep_Logs(){
    LOGINFO=$1
    # Date/Time Veriables
    LOG_DATE='date "+%Y-%m-%d"'
    LOG_TIME='date "+%H-%M-%S"'
    CDATE=$(date "+%Y-%m-%d")
    CTIME=$(date "+%H-%M-%S")
    echo "${CDATE} ${CTIME}: ${SHELL_NAME} : ${LOGINFO}" 
    echo "${CDATE} ${CTIME}: ${SHELL_NAME} : ${LOGINFO}" >> ${SHELL_LOG}
    }

usage(){
    Keep_Logs  $"Usage: $0 { [deploy | rollback] [DEV |PRD |UAT | MASTER ] [ version ]}"
    Keep_Logs  $"Example: $0  rollback DEV  1.0.0 "
    }
 
   
Lock_Shell(){
    touch ${LOCK_FILE}
    Keep_Logs "Info:Create lockfile ${LOCK_FILE}"
}
 
 
Unlock_Shell(){
    Keep_Logs "Info:……remove ${LOCK_FILE}"
    rm -f ${LOCK_FILE}
    Keep_Logs "Info:removed ${LOCK_FILE}"
}


#检查web 服务器是否部署成功,如果30分钟还不可以被访问,则认为服务器可能存在问题。
URL_Test(){
    local node=$1
    local URL="http://$node:8080/login.jsp"
    Keep_Logs "Info:…… URL_Test $URL";
    # curl -s --head $URL | grep "200 OK";
    num=1
    curl -s --head $URL | grep "200 OK";
    while ([ $? -eq 1 ] && [ "${num}" -lt "181"  ]); do
       echo ${num};
       if [ ${num} -eq 120 ]
       then
            echo "启动超时";
            Keep_Logs "ERROR: Time out,failed to start app on ${node} ";
            break;
       fi
       num=$[${num}+1];
       sleep 10s;
       Keep_Logs "Info:$URL is not online,will check about 9 s later";
       curl -s --head $URL | grep "200 OK";
    done
    if [ ${num} -le 120 ]
       then
            Keep_Logs "INFO: succeed start Server ${node} ";
       fi
}


Deploy_Code(){
    local node=$1;
    Keep_Logs "Info:Deploy_Code $1"
    # ssh $node "cd /opt/ && tar xfz ${PKG_NAME}.tar.gz"
    ssh -fn ekp@$node "source ~/.bash_profile 
    &&cd /data/EKP_Attachment/ekpcode 
    && unzip ${PKG_NAME}.zip -d /data/ekp/ 
    && rm -f /data/ekp/$PRO_NAME 
    && ln -s /data/ekp/${PKG_NAME} /data/ekp/${PRO_NAME} 
    && killall -9 java >/dev/null 2>&1  
    && sleep 10s 
    && cd /data/ekp/linux64/  
    && ./start-normal64.sh >/dev/null 2>&1 &";
    echo "sleep 10 秒钟";
    sleep 10s;
    URL_Test ${node};
}
 
 
main(){
    #判定操作方式
    #部署版本
    PKG_NAME=$1

    Keep_Logs "Info:Begin"
    # 锁定判断
    if [ -f ${LOCK_FILE} ];then
        Keep_Logs "WARN:Deploy is running,you can try it later."  && exit;   
    else
        Lock_Shell;
        Keep_Logs "INFO:Deploy Server list is:$PRD_LIST";
        for node in $PRD_LIST;do
            Deploy_Code $node;
        done
    fi
    
    Unlock_Shell;
    }

main $1 


#代码要求授予所有用户读取权限
原文地址:https://www.cnblogs.com/my-first-blog-lgz/p/13825006.html