zoukankan      html  css  js  c++  java
  • linux 平台实现 web 服务器的自动化发布(功能相对完整)

    linux 平台实现 web 服务器的自动化发布

    背景说明

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

    一:环境说明

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

    二、开发语言:

    1. linux Shell
    2. 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,操作更方便哦

  • 相关阅读:
    Google Map Api V3 系列之 导航(包括清除线路)
    ENSP学习华为防火墙功能
    让Chrome 浏览器显示隐藏的https和www
    win7 x64 SP1把IE从8升级到11的先决条件
    解决“Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足……”
    火绒软件没有离线病毒库独立安装包的解决方法
    成功注册GitHub20211116
    网络基础知识积累
    【问题解决】win10连接了不可路由的以太网后,会阻止使用 WWAN 访问 Internet
    ENSP学习华为防火墙(第二天,20211127 )
  • 原文地址:https://www.cnblogs.com/vmsky/p/13825543.html
Copyright © 2011-2022 走看看