【python14】自動(dòng)化部署tomcat

前提條件:
1、安裝linux系統(tǒng)
2深夯、打開linux系統(tǒng)的ssh服務(wù)
3抖格、關(guān)閉linux系統(tǒng)遠(yuǎn)程防火墻
4诺苹、在linux系統(tǒng)安裝tomcat服務(wù)
5咕晋、提前準(zhǔn)備好應(yīng)用war包
6、需要安裝paramiko服務(wù)

使用場(chǎng)景:
節(jié)省重復(fù)又麻煩的手動(dòng)部署動(dòng)作收奔,自動(dòng)化多服務(wù)部署提高效率掌呜。

第一步:安裝jdk依賴包
第二步:安裝tomcat包

#coding=utf-8

import paramiko
import time

# 創(chuàng)建SSH客戶端用來遠(yuǎn)程連接服務(wù)器進(jìn)行操作
class sshClient:

    # 構(gòu)造函數(shù),創(chuàng)建一個(gè)ssh服務(wù)對(duì)象
    def __init__(self, host, port, username, password):
        self.host = host
        self.port = port
        self.username = username
        self.password = password

        try:
            self.ssh = paramiko.SSHClient()
            self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            self.ssh.connect(self.host, self.port, self.username, self.password)
        except Exception as e:
            print "ssh鏈接失斊汉濉:①請(qǐng)檢查ip质蕉、端口、用戶名翩肌、密碼是否錯(cuò)誤模暗;②請(qǐng)檢查目標(biāo)服務(wù)是否開啟ssh并關(guān)閉防火墻。", e

    # 調(diào)用遠(yuǎn)程命令的函數(shù)
    def cmd(self, cmd):
        try:
            transport = self.ssh.get_transport()
            channel = transport.open_session()  # 連接成功后打開一個(gè)channel
            channel.get_pty()   # 打開遠(yuǎn)程的terminal
            channel.exec_command(cmd)   # 執(zhí)行cmd命令

            result = []
            while True:
                r = channel.recv(1024) # 接收socket返回的數(shù)據(jù)
                if not r:
                    break
                else:
                    result.append(r)
            channel.close()
            return "".join(result)
        except Exception as e:
            print "cmd執(zhí)行失敗念祭。", e

    # 下載遠(yuǎn)程地址的文件
    def down(self, localdir, romatedir):
        try:
            ftp = self.ssh.open_sftp()
            ftp.get(romatedir, localdir)
            ftp.close()
        except Exception as e:
            print "文件下載失敗兑宇。", e

    # 上傳本地文件到遠(yuǎn)程地址
    def upload(self, localdir, romatedir):
        try:
            ftp = self.ssh.open_sftp() # 通過ssh打開ftp通訊通道
            ftp.put(localdir, romatedir)
            ftp.close()
        except Exception as e:
            print "文件上傳失敗。", e

    # 關(guān)閉ssh鏈接
    def close(self):
        self.ssh.close()


# 創(chuàng)建自動(dòng)化部署Tomcat服務(wù)粱坤,用于自動(dòng)化部署和運(yùn)行
class deployTomcat:

    def __init__(self, host, port, username, password, tomcaturl, localurl, romateurl):
        self.host = host
        self.port = port
        self.username = username
        self.password = password
        self.tomcaturl = tomcaturl
        self.localurl = localurl
        self.romateurl = romateurl

    def install(self):
        ssh = sshClient(self.host, self.port, self.username, self.password)
        # 殺死Tomcat線程
        print "\033[1;35m正在執(zhí)行殺死Tomcat線程...\033[0m"
        ssh.cmd("ps aux | grep " + self.tomcaturl + " | grep -v grep | awk '{print $2}' | xargs kill -9")

        print ""

        # 創(chuàng)建Tomcat7文件夾
        print "\033[1;35m創(chuàng)建Tomcat7文件夾...\033[0m"
        print ssh.cmd("rm -rf " + self.tomcaturl + ";mkdir " + self.tomcaturl)

        print ""

        # 上傳Tomcat安裝包
        print "\033[1;35m上傳Tomcat安裝包...\033[0m"
        print ssh.upload(self.localurl, self.romateurl)

        print ""

        # 解壓并安裝Tomcat
        print "\033[1;35m解壓并安裝Tomcat...\033[0m"
        print ssh.cmd("tar -xzf " + self.romateurl + " -C "+ self.tomcaturl +" --strip-components 1")

        print ""

        # 啟動(dòng)tomcat
        print "\033[1;35m啟動(dòng)tomcat...\033[0m"
        print ssh.cmd("nohup " + self.tomcaturl + "/bin/startup.sh")

        print ""

        # 查看tomcat日志
        print "\033[1;35m查看tomcat日志...\033[0m"
        print ssh.cmd("cat " + self.tomcaturl + "/logs/catalina.out")

        print ""

        # 檢查tomcat是否啟動(dòng)
        print "\033[1;35m檢查tomcat是否啟動(dòng)...\033[0m"
        print ssh.cmd("ps aux | grep " + self.tomcaturl + " | grep -v grep | awk '{print $2}'")

        # 關(guān)閉ssh
        ssh.close()


if __name__ == "__main__":

    host = "172.20.10.10"
    port = 22
    username = "root"
    password = "xxxx"
    tomcaturl = "/usr/local/tomcat7"
    localurl = "/Users/xxxx/Desktop/apache-tomcat-7.0.54.tar.gz"
    romateurl = tomcaturl + "/apache-tomcat-7.0.54.tar.gz"

    dep = deployTomcat(host, port, username, password, tomcaturl, localurl, romateurl)
    dep.install()

第三:上傳應(yīng)用并啟動(dòng)tomcat

#coding=utf-8

import paramiko
import time

# 創(chuàng)建SSH客戶端用來遠(yuǎn)程連接服務(wù)器進(jìn)行操作
class sshClient:

    # 構(gòu)造函數(shù)隶糕,創(chuàng)建一個(gè)ssh服務(wù)對(duì)象
    def __init__(self, host, port, username, password):
        self.host = host
        self.port = port
        self.username = username
        self.password = password

        try:
            self.ssh = paramiko.SSHClient()
            self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            self.ssh.connect(self.host, self.port, self.username, self.password)
        except Exception as e:
            print "ssh鏈接失敗:①請(qǐng)檢查ip站玄、端口枚驻、用戶名、密碼是否錯(cuò)誤株旷;②請(qǐng)檢查目標(biāo)服務(wù)是否開啟ssh并關(guān)閉防火墻再登。", e

    # 調(diào)用遠(yuǎn)程命令的函數(shù)
    def cmd(self, cmd):
        try:
            '''
            stdin, stdout, stderr = self.ssh.exec_command(cmd, get_pty=True)
            err = stderr.readlines()
            if len(err) > 0:
                print err
            for std in stdout.readlines():
                print std,
            '''
            transport = self.ssh.get_transport()
            channel = transport.open_session()  # 連接成功后打開一個(gè)channel
            channel.get_pty()   # 打開遠(yuǎn)程的terminal
            channel.exec_command(cmd)   # 執(zhí)行cmd命令

            while True:
                result = channel.recv(1024)   # 接收socket返回的數(shù)據(jù)
                if not result:
                    break
                print result,
            channel.close()
        except Exception as e:
            print "cmd執(zhí)行失敗。", e

    # 下載遠(yuǎn)程地址的文件
    def down(self, localdir, romatedir):
        try:
            ftp = self.ssh.open_sftp()
            ftp.get(romatedir, localdir)
            ftp.close()
        except Exception as e:
            print "文件下載失敗。", e

    # 上傳本地文件到遠(yuǎn)程地址
    def upload(self, localdir, romatedir):
        try:
            ftp = self.ssh.open_sftp() # 通過ssh打開ftp通訊通道
            ftp.put(localdir, romatedir)
            ftp.close()
        except Exception as e:
            print "文件上傳失敗霎冯。", e

    # 關(guān)閉ssh鏈接
    def close(self):
        self.ssh.close()


# 創(chuàng)建自動(dòng)化部署Tomcat服務(wù)铃拇,用于自動(dòng)化部署和運(yùn)行
class deployTomcat:

    def __init__(self, host, port, username, password, tomcaturl, localwarurl, romatewarurl):
        self.host = host
        self.port = port
        self.username = username
        self.password = password
        self.tomcaturl = tomcaturl
        self.localwarurl = localwarurl
        self.romatewarurl = romatewarurl

    def run(self):
        ssh = sshClient(self.host, self.port ,self.username, self.password)
        '''
            自動(dòng)化部署tomcat
            1.關(guān)閉tomcat服務(wù)
            2.殺死tomcat線程
            3.備份應(yīng)用
            4.刪除老應(yīng)用
            5.上傳代碼war包
            6.啟動(dòng)tomcat服務(wù)
            7.打印tomcat日志
            8.檢查tomcat是否啟動(dòng)
        '''

        print ""

        # 關(guān)閉Tomcat服務(wù)
        print "\033[1;35m正在執(zhí)行關(guān)閉Tomcat服務(wù)...\033[0m"
        print self.tomcaturl + "/bin/shutdown.sh"
        ssh.cmd(self.tomcaturl + "/bin/shutdown.sh")

        print ""

        # 殺死Tomcat線程
        print "\033[1;35m正在執(zhí)行殺死Tomcat線程...\033[0m"
        ssh.cmd("ps aux | grep " + self.tomcaturl + " | grep -v grep | awk '{print $2}' | xargs kill -9")

        print ""

        # 備份應(yīng)用
        print "\033[1;35m正在執(zhí)行備份應(yīng)用...\033[0m"
        ssh.cmd('cp -r ' + self.tomcaturl + '/webapps/webtest ' + self.tomcaturl + '/webtest_' + time.strftime('%Y%m%d_%H%M%S'))

        print ""

        # 刪除老版本應(yīng)用
        print "\033[1;35m正在執(zhí)行刪除老版本應(yīng)用...\033[0m"
        ssh.cmd('rm -rf ' + self.tomcaturl + '/webapps/webtest*')

        print ""

        # 上傳代碼war包
        print "\033[1;35m正在執(zhí)行上傳代碼war包...\033[0m"
        ssh.upload(self.localwarurl, self.romatewarurl)

        print ""

        # 啟動(dòng)tomcat
        print "\033[1;35m正在執(zhí)行啟動(dòng)Tomcat服務(wù)...\033[0m"
        ssh.cmd("nohup " + self.tomcaturl + "/bin/startup.sh")

        print ""

        # 查看tomcat日志
        print "\033[1;35m正在執(zhí)行查看Tomcat日志...\033[0m"
        ssh.cmd("cat " + self.tomcaturl + "/logs/catalina.out")

        print ""

        # 檢查tomcat是否啟動(dòng)
        print "\033[1;35m正在執(zhí)行檢查Tomcat是否啟動(dòng)...\033[0m"
        ssh.cmd("ps aux | grep " + self.tomcaturl + " | grep -v grep | awk '{print $2}'")

        # 關(guān)閉ssh
        ssh.close()

if __name__ == "__main__":
    #ssh = sshClient("172.20.10.5", 22, "root", "xxx")
    #ssh.cmd("cd /etc;ls -i")
    #ssh.cmd("top")
    #ssh.cmd("ping www.baidu.com")

    '''
        自動(dòng)化部署tomcat
        1.關(guān)閉tomcat服務(wù)
        2.殺死tomcat線程
        3.備份應(yīng)用
        4.刪除老應(yīng)用
        5.上傳代碼war包
        6.啟動(dòng)tomcat服務(wù)
        7.打印tomcat日志
        8.檢查tomcat是否啟動(dòng)
    '''

    host = "172.20.10.5"
    port = 22
    username = "root"
    password = "xxx"
    tomcaturl = "/usr/local/tomcat7"
    localwarurl = "/Users/xxx/Desktop/webtest.war"
    romatewarurl = tomcaturl + "/webapps/webtest.war"

    print "自動(dòng)化部署Tomcat服務(wù),IP ",host, "開始"
    dep = deployTomcat(host, port, username, password, tomcaturl, localwarurl, romatewarurl)
    dep.run()
    print "自動(dòng)化部署Tomcat服務(wù)沈撞,IP ", host, "結(jié)束"


    host = "172.20.10.6"
    port = 22
    username = "root"
    password = "xxx"
    tomcaturl = "/usr/local/tomcat7"
    localwarurl = "/Users/xxx/Desktop/webtest.war"
    romatewarurl = tomcaturl + "/webapps/webtest.war"

    print ""

    print "自動(dòng)化部署Tomcat服務(wù)慷荔,IP ", host, "開始"
    dep = deployTomcat(host, port, username, password, tomcaturl, localwarurl, romatewarurl)
    dep.run()
    print "自動(dòng)化部署Tomcat服務(wù),IP ", host, "結(jié)束"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缠俺,一起剝皮案震驚了整個(gè)濱河市显晶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌壹士,老刑警劉巖磷雇,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異躏救,居然都是意外死亡唯笙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門盒使,熙熙樓的掌柜王于貴愁眉苦臉地迎上來崩掘,“玉大人,你說我怎么就攤上這事少办“” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵英妓,是天一觀的道長挽放。 經(jīng)常有香客問我,道長蔓纠,這世上最難降的妖魔是什么辑畦? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮腿倚,結(jié)果婚禮上纯出,老公的妹妹穿的比我還像新娘。我一直安慰自己猴誊,他們只是感情好潦刃,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著懈叹,像睡著了一般乖杠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上澄成,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天胧洒,我揣著相機(jī)與錄音畏吓,去河邊找鬼。 笑死卫漫,一個(gè)胖子當(dāng)著我的面吹牛菲饼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播列赎,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼宏悦,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了包吝?” 一聲冷哼從身側(cè)響起饼煞,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎诗越,沒想到半個(gè)月后砖瞧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嚷狞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年块促,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片床未。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡竭翠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出即硼,到底是詐尸還是另有隱情逃片,我是刑警寧澤屡拨,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布只酥,位于F島的核電站,受9級(jí)特大地震影響呀狼,放射性物質(zhì)發(fā)生泄漏裂允。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一哥艇、第九天 我趴在偏房一處隱蔽的房頂上張望绝编。 院中可真熱鬧,春花似錦貌踏、人聲如沸十饥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逗堵。三九已至,卻和暖如春眷昆,著一層夾襖步出監(jiān)牢的瞬間蜒秤,已是汗流浹背汁咏。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留作媚,地道東北人攘滩。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像纸泡,于是被迫代替她去往敵國和親漂问。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容