python自動化啓動,備份,上傳tomcat

解決問題:解決公司線上線下,統一自動化部署

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獲取
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章