http://ask.apelearn.com/question/8020
脚本如下:============================================================================================== #!/usr/bin/env python ##coding:utf-8 #written by xeonzhang #Description: 自动部署tomcat程序,当启动成功nginx自动切换配置转发端口 #Create_time:20150519 import os import subprocess import re import sys import time import datetime import paramiko import pexpect import math import urllib2 def fail_to_delete(mount_path): #通过nginx配置文件判断目前哪一个tomcat在运行 is_tomcat8080_start = 'cat /usr/share/nginx/conf/nginx.conf | grep tomcat6_4_8080.conf | wc -l' is_tomcat8080_count = int(subprocess.check_output(is_tomcat8080_start,shell=True).strip()) if is_tomcat8080_count == 1: #为1则将tomcat6_4_8082所在的服务停止 stop_tomcat8082 = '/usr/share/tomcat6_4_8082/start.sh stop' os.system(stop_tomcat8082) print "已关闭启动失败的tomcat进程" #删除tomcat6_4_8082所有传进去的代码 rm_tomcat8082_code = 'rm -rf /usr/share/tomcat6_4_8082/lubanwebapps/*' os.system(rm_tomcat8082_code) print "已删除启动失败的程序代码!" #传False值给外部程序 echo_status_command = "echo ' ' >%s/tomcat_log/False" %mount_path os.system(echo_status_command) else: #不为1则将tomcat6_4_8080所在的服务停止 stop_tomcat8080 = '/usr/share/tomcat6_4_8080/start.sh stop' os.system(stop_tomcat8080) print "已关闭启动失败的tomcat进程" #删除tomcat6_4_8080所有传进去的代码 rm_tomcat8080_code = 'rm -rf /usr/share/tomcat6_4_8080/lubanwebapps/*' os.system(rm_tomcat8080_code) print "已删除启动失败的程序代码!" #传False值给外部程序 echo_status_command = "echo ' ' >%s/tomcat_log/False" %mount_path os.system(echo_status_command) def change_nginx_conf(mount_path): #通过nginx配置文件判断目前哪一个tomcat在运行 is_tomcat8080_start = 'cat /usr/share/nginx/conf/nginx.conf | grep tomcat6_4_8080.conf | wc -l' is_tomcat8080_count = int(subprocess.check_output(is_tomcat8080_start,shell=True).strip()) #为True则将配置文件切换成tomcat6_4_8082.conf if is_tomcat8080_count == 1: change_conf_command = "sed -i 's#tomcat6_4_8080.conf#tomcat6_4_8082.conf#g' /usr/share/nginx/conf/nginx.conf" os.system(change_conf_command) print "nginx配置已经成功切换至tomcat6_4_8082.conf!" #reload nginx nginx_reload_command = '/etc/init.d/nginx reload' os.system(nginx_reload_command) #传True值给外部程序 echo_status_command = "echo ' ' >%s/tomcat_log/True" %mount_path os.system(echo_status_command) #结束tomcat6_4_8080进程 stop_tomcat8080_pid = '/usr/share/tomcat6_4_8080/start.sh stop' os.system(stop_tomcat8080_pid) print "现tomcat启动成功,原有tomcat服务进程已停止" #删除tomcat6_4_8080目录下的所有代码 rm_8080_code = 'rm -rf /usr/share/tomcat6_4_8080/lubanwebapps/*' os.system(rm_8080_code) print "现tomcat启动成功,原有tomcat代码已删除" else: change_conf_command = "sed -i 's#tomcat6_4_8082.conf#tomcat6_4_8080.conf#g' /usr/share/nginx/conf/nginx.conf" os.system(change_conf_command) print "nginx配置已经成功切换至tomcat6_4_8080.conf!" #reload nginx nginx_reload_command = '/etc/init.d/nginx reload' os.system(nginx_reload_command) #传True值给外部程序 echo_status_command = "echo ' ' >%s/tomcat_log/True" %mount_path os.system(echo_status_command) #结束tomcat6_4_8082进程 stop_tomcat8082_pid = '/usr/share/tomcat6_4_8082/start.sh stop' os.system(stop_tomcat8082_pid) print "现tomcat启动成功,原有tomcat服务进程已停止" #删除tomcat6_4_8082目录下的所有代码 rm_8082_code = 'rm -rf /usr/share/tomcat6_4_8082/lubanwebapps/*' os.system(rm_8082_code) print "现tomcat启动成功,原有tomcat代码已删除" def tomcat_check_httpcode(code_path, port): #循环查询当前几个项目返回的httpcode值 webapps_dir_list = os.listdir(code_path) for w in webapps_dir_list: url = ' http://localhost:8082/%s' %(port, w.split('.')[0]) response = 'None' try: response = urllib2.urlopen(url,timeout=5) if str(response.getcode())[0] != '2': return False response.close() except urllib2.URLError as e: if hasattr(e, 'code'): print 'Error code:',e.code return False elif hasattr(e, 'reason'): print 'Reason:',e.reason return False return True def tomcat_check_error(mount_path): #判断挂载目录下日志文件目录是否存在,存在则删除 test_log_exit = 'test -d %s/tomcat_log && rm -rf %s/tomcat_log' %(mount_path, mount_path) #通过nginx配置文件判断目前哪一个tomcat在运行 is_tomcat8080_start = 'cat /usr/share/nginx/conf/nginx.conf | grep tomcat6_4_8080.conf | wc -l' is_tomcat8080_count = int(subprocess.check_output(is_tomcat8080_start,shell=True).strip()) boolean_is_success = True if is_tomcat8080_count == 1: #删除tomcat8082内所有不需要的遗留物 rm_tomcatlog_in_mount = 'test -d %s/tomcat_log && rm -rf %s/tomcat_log' %(mount_path, mount_path) rm_tomcat8082_pre_code = 'rm -rf /usr/share/tomcat6_4_8082/lubanwebapps/*' rm_tomcat8082_pre_logs = 'rm -rf /usr/share/tomcat6_4_8082/logs/*' os.system(rm_tomcat8082_pre_code) os.system(rm_tomcat8082_pre_logs) os.system(rm_tomcatlog_in_mount) #将外面挂载目录的数据拷贝到8082端口容器的webapps目下 cp_to8082_command = 'cp -a %s/* /usr/share/tomcat6_4_8082/lubanwebapps/' %mount_path print "开始拷贝编译包到tomcat_8082目录..." os.system(cp_to8082_command) #清理tomcat8082 日志目录 print "拷贝数据完成!" print "+----------------------------------------------------------+" print "***************开始启动tomcat_8082程序 *******************" print "+----------------------------------------------------------+" start_tomcat8082 = '/usr/share/tomcat6_4_8082/start.sh start' os.system(start_tomcat8082) #软链接日志文件到挂载目录里面 ln_command = 'ln -s /home/www/data/log/tomcat6_4_8082 %s/tomcat_log' %mount_path os.system(ln_command) #循环100次 for i in range(1,100): ##根据tomcat日志判断启动是否成功 list_error_keywords = ['Exception','SEVERE','ERROR','严重','错误'] list_success_keywords = [] #当有一个或多个错误关键字时候判断tomcat启动失败 for e in list_error_keywords: is_error_command = 'cat /home/www/data/log/tomcat6_4_8082/catalina.out | grep %s | wc -l ' %e is_error_count = int(subprocess.check_output(is_error_command,shell=True).strip()) if is_error_count != 0: print "tomcat8082启动失败!" #停止tomcat8082的启动,并删除目录内的文件 boolean_is_success = False return False #判断当返回httpcode值都是2开头的状态码时,返回True if tomcat_check_httpcode('/usr/share/tomcat6_4_8082/lubanwebapps','8082'): return True #休眠5秒 time.sleep(5) #当参数为True的时候,判断tomcat启动成功 if boolean_is_success == True: return True else: #删除tomcat8080内所有不需要的遗留物 rm_tomcat8080_pre_code = 'rm -rf /usr/share/tomcat6_4_8080/lubanwebapps/*' rm_tomcat8080_pre_logs = 'rm -rf /usr/share/tomcat6_4_8080/logs/*' rm_tomcatlog_in_mount = 'test -d %s/tomcat_log && rm -rf %s/tomcat_log' %(mount_path, mount_path) os.system(rm_tomcat8080_pre_code) os.system(rm_tomcat8080_pre_logs) os.system(rm_tomcatlog_in_mount) #将外面挂载目录的数据拷贝到8080端口容器的webapps目下 cp_to8080_command = 'cp -a %s/* /usr/share/tomcat6_4_8080/lubanwebapps/' %mount_path print "开始拷贝编译包到tomcat_8080目录..." os.system(cp_to8080_command) print "拷贝数据完成!" print "+----------------------------------------------------------+" print "***************开始启动tomcat_8080程序 *******************" print "+----------------------------------------------------------+" start_tomcat8080 = '/usr/share/tomcat6_4_8080/start.sh start' os.system(start_tomcat8080) #软链接日志文件到挂载目录里面 ln_command = 'ln -s /home/www/data/log/tomcat6_4_8080 %s/tomcat_log' %mount_path for i in range(1,100): ##根据tomcat日志判断启动是否成功 list_error_keywords = ['Exception','SEVERE','ERROR','严重','错误'] list_success_keywords = [] #当有一个或多个错误关键字时候判断tomcat启动失败 for e in list_error_keywords: is_error_command = 'cat /home/www/data/log/tomcat6_4_8080/catalina.out | grep %s | wc -l ' %e is_error_count = int(subprocess.check_output(is_error_command,shell=True).strip()) if is_error_count != 0: print "tomcat8080启动失败!" #停止tomcat8080的启动,并删除目录内的文件 boolean_is_success = False return False #判断当返回httpcode值都是2开头的状态码时,返回True if tomcat_check_httpcode('/usr/share/tomcat6_4_8080/lubanwebapps','8080'): return True #休眠5秒 time.sleep(5) #当参数为True的时候,判断tomcat启动成功 if boolean_is_success == True: return True #主程序入口 if __name__ == "__main__" : #argv mount_path = '/usr/share/codes' #判断tomcat是否启动成功 if tomcat_check_error(mount_path): #成功则切换nginx配置,并且返回一个文件告知是否成功 change_nginx_conf(mount_path) else: #不成功则删除该失败tomcat内的所有程序,并且返回一个文件告知启动失败 fail_to_delete(mount_path) ================================================================================== 功能需求:在一台服务器或者docker容器内 安装了2个tomcat+1个nginx nginx:用于转发 tomcat:一个正常启动运行,当有新的代码提交时候,自动将代码存入另一个非启动tomcat内,并且启动。 判断:当新tomcat启动成功,则停掉原来的tomcat,并且修改nginx转发端口 当新tomcat启动不成功,则删除新tomcat内代码。返回启动不成功信息。 心得:需求不复杂,只是细节考虑的要全面,什么时候要删除什么,逻辑需要清晰。另外就是要不停的测试脚本有没有BUG存在! 用到了urllib2库,还判断http get的code值是不是200.这是新运用到的库。