解決問題:解決公司線上線下,統一自動化部署
python 環境配置,偷下懶找度娘
python 版本:3.7.2
案例:
當多個項目,多服務器負載均衡需要啓動部署時,減少更新時間定製python 腳本
更新:
測試機器:47.111.152.162 對應awhnapp.war,awhnacti.war
本地環境 :192.168.1.129 對應 awhncc
擴展性強,可以通過config.json 配置指定需要運行的項目
文件名: _sy_deploy_before_online_java.py
# -*- coding: utf-8 -*-
import json
import paramiko
from glob import glob
import datetime
CONFIG_FILE = "config.json"
class shell:
def __init__(self):
pass
def read_config_files(self):
with open(CONFIG_FILE, 'r') as load_f:
load_dict = json.load(load_f)
load_f.close()
return load_dict
def __inits__(self, param):
self.ip = param.get('ip')
self.port = param.get('port')
self.user = param.get('user')
self.pwd = param.get('pwd')
self.tomcat_path = param.get('tomcat_path')
self.update_path = param.get('update_path')
self.local_source_path = param.get('local_source_path')
self.package = param.get('package')
self.jdk = param.get('jdk')
def __ftp__(self):
transport = paramiko.Transport((self.ip, self.port))
transport.connect(username=self.user, password=self.pwd)
sftp = paramiko.SFTPClient.from_transport(transport)
print("===========xftp shh wrap begin==============")
now_time = datetime.datetime.now().strftime('%Y%m%d')
mStr = self.package
mlist = mStr.split(',')
for item in mlist:
packageName = item + '.war'
packages = item + '.war '
path = self.local_source_path + '/' + packages
old_path = glob(path)[0]
npos = old_path.rfind('/')
if npos == -1:
npos = old_path.rfind('\\')
package = old_path[npos + 1:]
self.package = package
toPath = self.update_path + now_time + '/'+packageName
print("topath:=", toPath)
print("old_path:=", old_path)
sftp.put(old_path, toPath) # cp aa.tar.gz
transport.close()
def __create__(self):
# 創建SSH對象
self.ssh = paramiko.SSHClient()
# 把要連接的機器添加到known_hosts文件中
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 連接服務器
self.ssh.connect(hostname=self.ip, port=self.port, username=self.user, password=self.pwd)
def __exe__(self, cmd):
cin, out, err = self.ssh.exec_command(cmd)
res = out.read()
if not res:
res = err.read()
return res
def __close__(self):
self.ssh.close()
def __title_ip__(self):
ip = 'ip:=' + self.ip
title = ip.center(111, '*')
return title
def __remove_old_bak__(self):
bin_path = self.update_path
tomcat_path = self.tomcat_path
now_time = datetime.datetime.now().strftime('%Y%m%d')
mkdir = bin_path + now_time
mStr = self.package
mlist = mStr.split(',')
packages = ''
for item in mlist:
packages = packages + item + '.war '
remove_xft_file = 'rm -r ' + mkdir
create_xft_file = 'mkdir -p ' + mkdir
cmd = remove_xft_file + ';'
cmd += create_xft_file + ';'
cmd += 'cd ' + tomcat_path + 'webapps;'
# 備份打包
bak_gz_name = mkdir + '/' + now_time + '_running_bak.tar.gz'
cmd += 'tar zcf ' + bak_gz_name + ' ' + packages
print("remove_old_bak:=", cmd)
return cmd
def __befor_ssh__(self):
print("===========try remove bak bin begin==============")
self.__create__()
cmd = self.__remove_old_bak__()
self.__exe__(cmd)
self.__close__()
print("===========try remove bak bin end==============")
def __ssh__(self):
self.__create__()
title = self.__title_ip__()
self.__close__()
return title
def convert(self):
self.__befor_ssh__()
self.__ftp__()
print("===========try zxvf aa.tar.gz begin==============")
return self.__ssh__()
def xftp(self):
config = self.read_config_files()
for i in config:
on_off = i['on-off']
if on_off == 'on':
bean_config_arr = i[i['project']]
for j in bean_config_arr:
shell.__inits__(j)
shell.convert()
##############tomcat 重啓==============
def restart(self):
# 初始化鏈接
config = self.read_config_files()
for i in config:
on_off = i['on-off']
if on_off == 'on':
bean_config_arr = i[i['project']]
for j in bean_config_arr:
shell.__inits__(j)
print("===========try restart bak bin begin ip:"+self.ip+"==============")
self.__create__()
cmd = self.__restart_tomat__()
stdin, stdout, stderr = self.ssh.exec_command("tomcat8_pid=$(ps -ef | grep " + self.tomcat_path + " | grep -v grep | awk '{print $2}')" + ';' + " echo $tomcat8_pid")
result = stdout.read().decode()
print("新tomcat pid:"+result)
self.__exe__(cmd)
self.__close__()
print("===========try restart bak bin end ip:"+self.ip+"==============")
def __restart_tomat__(self):
bin_path = self.update_path
tomcat_path = self.tomcat_path
now_time = datetime.datetime.now().strftime('%Y%m%d')
mkdir = bin_path + now_time
mStr = self.package
mlist = mStr.split(',')
cmd = "tomcat8_pid=$(ps -ef | grep " + tomcat_path + " | grep -v grep | awk '{print $2}')" + ';'
cmd += "kill -9 $tomcat8_pid" + ';'
for item in mlist:
cmd += "rm -rf " + tomcat_path + 'webapps/' + item + "*" + ';'
cmd += 'cp ' + mkdir + '/' + item + '.war' + ' ' + tomcat_path + 'webapps' + ';'
cmd += 'export JAVA_HOME=' + self.jdk + ';' + tomcat_path + 'bin/startup.sh' + ';'
print("restart tomcat:=", cmd)
return cmd
if __name__ == '__main__':
# 原包路徑
shell = shell()
shell.xftp()
shell.restart()
配置config.json
[
{
"on-off":"on",
"project":"kxgz" ,
"kxgz":[
{
"ip":"47.111.152.162",
"port":220**,
"user":"user_01",
"pwd":"GXKNL***",
"tomcat_path":"/wwwroot/java/tomcat-kxgz/",
"update_path":"/wwwroot/java/update/bj/",
"local_source_path":"C:/Users/10148/Desktop/c/",
"package":"awhnapp,awhnacti",
"jdk":"/wwwroot/java/jdk1.8.0_111/"
}
]
},
{
"on-off":"on",
"project":"awhn" ,
"awhn":[
{
"ip":"192.168.1.129",
"port":22,
"user":"user_01",
"pwd":"Z@w&oH@XC6c1$iMj",
"tomcat_path":"/wwwroot/java/tomcat-kxgzagent/",
"update_path":"/wwwroot/java/update/bj/",
"local_source_path":"C:/Users/10148/Desktop/c/",
"package":"awhncc",
"jdk":"/wwwroot/java/jdk1.8.0_111/"
}
]
}
]
可以命令運行:python _sy_deploy_before_online_java.py
運行後結果輸出:
C:\Users\10148\AppData\Local\Programs\Python\Python37\python.exe E:/code/workspace-qs-py/RegressionTest/RegressionTest/common/_sy_deploy_before_online_java.py
===========try remove bak bin begin==============
remove_old_bak:= rm -r /wwwroot/java/update/bj/20200429;mkdir -p /wwwroot/java/update/bj/20200429;cd /wwwroot/java/tomcat-kxgz/webapps;tar zcf /wwwroot/java/update/bj/20200429/20200429_running_bak.tar.gz awhnapp.war awhnacti.war
===========try remove bak bin end==============
===========xftp shh wrap begin==============
topath:= /wwwroot/java/update/bj/20200429/awhnapp.war
old_path:= C:/Users/10148/Desktop/c//awhnapp.war
topath:= /wwwroot/java/update/bj/20200429/awhnacti.war
old_path:= C:/Users/10148/Desktop/c//awhnacti.war
===========try zxvf aa.tar.gz begin==============
===========try remove bak bin begin==============
remove_old_bak:= rm -r /wwwroot/java/update/bj/20200429;mkdir -p /wwwroot/java/update/bj/20200429;cd /wwwroot/java/tomcat-kxgzagent/webapps;tar zcf /wwwroot/java/update/bj/20200429/20200429_running_bak.tar.gz awhncc.war
===========try remove bak bin end==============
===========xftp shh wrap begin==============
topath:= /wwwroot/java/update/bj/20200429/awhncc.war
old_path:= C:/Users/10148/Desktop/c//awhncc.war
===========try zxvf aa.tar.gz begin==============
===========try restart bak bin begin ip:47.111.152.162==============
restart tomcat:= tomcat8_pid=$(ps -ef | grep /wwwroot/java/tomcat-kxgz/ | grep -v grep | awk '{print $2}');kill -9 $tomcat8_pid;rm -rf /wwwroot/java/tomcat-kxgz/webapps/awhnapp*;cp /wwwroot/java/update/bj/20200429/awhnapp.war /wwwroot/java/tomcat-kxgz/webapps;rm -rf /wwwroot/java/tomcat-kxgz/webapps/awhnacti*;cp /wwwroot/java/update/bj/20200429/awhnacti.war /wwwroot/java/tomcat-kxgz/webapps;export JAVA_HOME=/wwwroot/java/jdk1.8.0_111/;/wwwroot/java/tomcat-kxgz/bin/startup.sh;
===========try restart bak bin end ip:47.111.152.162==============
===========try restart bak bin begin ip:192.168.1.129==============
restart tomcat:= tomcat8_pid=$(ps -ef | grep /wwwroot/java/tomcat-kxgzagent/ | grep -v grep | awk '{print $2}');kill -9 $tomcat8_pid;rm -rf /wwwroot/java/tomcat-kxgzagent/webapps/awhncc*;cp /wwwroot/java/update/bj/20200429/awhncc.war /wwwroot/java/tomcat-kxgzagent/webapps;export JAVA_HOME=/wwwroot/java/jdk1.8.0_111/;/wwwroot/java/tomcat-kxgzagent/bin/startup.sh;
===========try restart bak bin end ip:192.168.1.129==============
Process finished with exit code 0
config.json 配置說明:
字段 | 說明 |
---|---|
on-off | 是否運行該服務器(on啓動,off 關閉) |
project | 啓動工程名 注意(改名字與下面數組arr 名字對應) |
awhn | 服務器信息,key 是對應project中value 值 |
ip | 服務器ip |
port | 服務器端口 |
pwd | 服務器密碼 |
tomcat_path | 服務器tomcat 路徑 |
update_path | 上傳包到服務器地址路徑 |
local_source_path | 本地上傳存放war包地址 |
package | 需要上傳的包名可以同一tomcat 中多war更新,以逗號(,)分割 |
jdk | 服務器jdk安裝地址可以通過 echo $JAVA_HOME獲取 |