linux 平台实现 web 服务器的自动化发布
背景说明
1、集团OA系统上线,web App 部署在6台服务器中,因项目初期,每次更新都需要进行大量的部署操作。操作费事费力部署,还容易出错,且缺乏通知机制。针对这一现状,计划通过脚本来实现半自动化的发布工作(因为无法解决自动化打包问题,只能采用半自动化方式了)
一:环境说明
-
OS:RHL 7.2
-
中间件: tomcat 7.0
二、开发语言:
- linux Shell
- Python 3.7
三、服务器分布
PRD | APP | vlxcndsz01ekpp1 |
---|---|---|
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、软件包存放在共享目录 参见
六、python+linux shell 代码
import time
import requests, json, pprint, datetime
import os
Server_dict = {
'0':['10.160.71.11','10.160.71.12','10.160.71.11'],
'1':['10.160.71.12','10.160.71.11','10.160.71.12']
}
headers = {
"Content-Type":"text/html;charset=UTF-8",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"ept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome",
}
App_Name=input("请输入软件名称:")
print(App_Name)
def make_logs(type,info):
with open('./logs/Deploy.log', 'a') as f:
f.write(type+':'+time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+':'+str(info)+'
')
#通过获取服务器的状态码,判定服务器的可用性
def get_webStatus(IP):
Req_URL = 'http://'+ IP +':8080/login.jsp'
res = requests.get(Req_URL, verify=False, headers=headers, params=None)
return res.status_code
def deploy_Service(IP,App):
os.system("nohup ./deploy_ekp.sh {} {} >/dev/null 2>&1 &".format(IP,App) )
def main(Server_dict,App_Name):
for key in Server_dict.keys():
Begin_time=datetime.datetime.now()
#获取主机,分两批进行推送
make_logs("INFO","部署开始,涉及服务器 {}".format(Server_dict[key]))
#执行推送人
for host in Server_dict[key]:
#执行推送操作
deploy_Service(host,App_Name)
#执行完推送任务后,休息20分钟
make_logs("INFO","部署中……,预计30分钟完成")
time.sleep(3)
#推送结果检查
while True:
#超时检测,及30分钟后还没有
if (datetime.datetime.now()-Begin_time).seconds > 1800:
make_logs("WARN","部署超时,涉及服务器 {}".format(Server_dict[key]))
#补充丁丁通知功能。
# print('if')
break
else:
# print(len(Server_dict[key]))
if(len(Server_dict[key])==0):
make_logs("INFO","第{}批服务器已经全部部署正常".format(key))
break
else:
for host in Server_dict[key]:
#应用服务器可用性判定检查判定
res_status_code=get_webStatus(host)
# print(res_status_code)
if(res_status_code==200):
Server_dict[key].remove(host)
make_logs("INFO","服务器:{}启动成功,启动耗时:{}.".format(host,(datetime.datetime.now()-Begin_time).seconds))
else:
make_logs("WARN","服务器:{}启动中。".format(host))
#部署每隔1分钟检查一下服务启动状态
time.sleep(3)
main(Server_dict,App_Name)
#推送结果告知
#!/bin/bash
#Shell Env,存放于bamboo 服务器vim
SHELL_NAME=$0
#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_NAME}.log
}
#检查web 服务器是否部署成功,如果30分钟还不可以被访问,则认为服务器可能存在问题。
Deploy_Code(){
ssh -fn ekp@$node >/dev/null 2>&1 << eeooff
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
sleep 10s
cd /data/ekp/linux64/
./start-normal64.sh >/dev/null 2>&1 &
eeooff
}
main(){
#判定操作方式
#部署版本
Host=$1
PKG_NAME=$2
Keep_Logs "Info:Begin"
if [ -f ${PKG_NAME} ];then
Deploy_Code ${Host} ${PKG_NAME};
else
Keep_Logs "${PKG_NAME} do not exist, progress will exit!";
fi
}
main $1 $2
#代码要求授予所有用户读取权限
源码:链接: https://pan.baidu.com/s/10GDUn3-PDFLvs3Ax3TVxBA 提取码: guca 复制这段内容后打开百度网盘手机App,操作更方便哦