Python 自動化升級更新項目

    負載均衡了A,B兩臺服務器win2008r2,一樣的路徑 D:\\IIS\\proName 放着Asp MVC4開放編譯好的項目,每次團隊修改bug或者添加新功能,我須要把A,B服務器的項目備份好,本機從TFS(感受仍是SVN好用點)獲取最新代碼,以後編譯,再覆蓋上服務器,操做的過程當中要注意些問題,好比說服務器項目裏的log4net生成的日誌文件不要壓縮備份,要否則壓縮文件會很大,覆蓋的時候,有些文件是不能替換的,好比說web.config,由於數據庫鏈接等一些信息是不同的,除此以外,還要作升級更新記錄,以備領導查詢等等linux

    因此萌發搞一個程序自動化升級更新,之因此用Python,只是由於正在學習,固然另外一方面是由於須要使用SSH協議來跟遠程服務器交互,Python的paramiko插件比我拿手C#的ssh.net好用多web

    說說個人思路
1. 只壓縮A服務器項目
2. 下載到本機解壓
3. 本機TFS更新項目,編譯發佈
4. 對比獲取服務器項目和本機發布項目的差別文件,並壓縮差別文件,以及記錄信息到數據庫
5. 上傳差別壓縮包到A和B服務器,並覆蓋替換shell

     部分核心代碼
        # 壓縮服務器項目
        client = paramiko.SSHClient()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        client.connect('服務器IP', 服務器ssh端口, username='服務器用戶名', password='服務器密碼', timeout=4)
        # paramiko ssh 遠程鏈接window,實際上是模擬成linux,因此要用linux shell命令來操做
        # 下面這個就是壓縮服務器項目,而且排除掉日誌文件夾
        comm = 'tar -zcvf 服務器備份包路徑.tar.gz --exclude=服務器項目日誌文件夾路徑 服務器項目路徑'
        stdin, stdout, stderr = client.exec_command(comm)
        stdout.readlines() # 要執行這句 要否則就快速關閉了
        client.close()數據庫

 

        # 下載服務器備份壓縮包
        t = paramiko.Transport(('服務器IP',服務器ssh端口))
        t.connect(username = '服務器用戶名', password = '服務器密碼')
        sftp = paramiko.SFTPClient.from_transport(t)
        remotepath = '服務器備份壓縮包路徑' # 這裏要用linux路徑寫法
        localpath = '本機保存路徑' # 這裏要用window路徑寫法
        sftp.get(remotepath, localpath)
        t.close()服務器

 

        # 解壓備份壓縮包,這裏用的window的cmd命令,能夠用ssh鏈接本機,再用linux shell命令的,只是想嘗試不一樣的作法而已,.tar.gz是linux特有的,window只能解壓不能壓縮生成
        # 不能直接使用字符串,要使用佔位符的形式來,也就是說不能用加號鏈接,我也不知道爲何,估計是路徑斜槓的問題,可是測試過不少種了,也不得,真心求解
        cmd = '"C:/Program Files/WinRAR/WinRAR" x %s * %s\\ -y' % ('壓縮包路徑', '解壓路徑')
        os.system(cmd)app

 

        #  對比差別,比較大小或者最後修改時間,要注意的就是最後修改時間會不一樣,本機win7的時間和服務器win2008r2的時間是同樣的,可是看下載回來的服務器壓縮包裏面的文件時間,有些文件,注意不是所有文件,只是有部分而已,它的時間會提早1秒,估計是由於通過linux系統產生了異常,文件大小這個倒沒有發現過異常
        s1 = os.path.getsize('源文件路徑')    # 獲取大小
        t1 = datetime.fromtimestamp(os.path.getmtime('源文件路徑')) # 獲取最後修改時間
        s2 = os.path.getsize('目標文件路徑')
        t2 = datetime.fromtimestamp(os.path.getmtime('目標文件路徑'))
        timespan = (t2 - t1).total_seconds() # 最後修改時間差別值,判斷3秒內的差別
        if s1 != s2 or timespan >= 3:
            pass # 是差別的負載均衡

 

        # 壓縮差別,由於要用ssh上傳到服務器操做,因此要linux的壓縮格式.tar.gz
        client = paramiko.SSHClient()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        client.connect('本機IP', 本機ssh端口, username='本機用戶名', password='本機密碼', timeout=4)
        comm = 'tar -zcvf 壓縮路徑包路徑.tar.gz 要壓縮的文件夾路徑'
        stdin, stdout, stderr = client.exec_command(comm)
        stdout.readlines() # 要執行這句 要否則就快速關閉了ssh

 

        # 上傳到服務器,這個就要循環了,由於有A B兩臺服務器,它們的ssh端口,登陸名,密碼都是同樣的
        arrServer = ['服務器A_IP', '服務器B_IP']
        for srv in arrServer:    
            t = paramiko.Transport((srv, 服務器端口))
            t.connect(username = '服務器用戶名', password = '服務器密碼')
            sftp = paramiko.SFTPClient.from_transport(t)
            remotepath = '服務器保存壓縮包路徑' # 這裏要用linux路徑寫法
            localpath = '本機壓縮包路徑' # 這裏要用window路徑寫法
            sftp.put(localpath, remotepath)
            t.close()學習

 

        # 最後就是服務器解壓,進行替換覆蓋了
        arrServer = ['服務器A_IP', '服務器B_IP']
        for srv in arrServer:    
            client = paramiko.SSHClient()
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            client.connect(srv, 服務器端口, username = '服務器用戶名', password = '服務器密碼', timeout=4)
            arrComm = []
            # 以日期新建備份差別文件夾,用來解壓差別文件
            arrComm.append('mkdir 差別文件存放文件夾')
            # 解壓差別
            arrComm.append('tar -zxvf 差別壓縮包路徑.tar.gz -C 差別文件存放文件夾')
            # 拷貝差別
            arrComm.append('cp -rf 差別文件存放文件夾 項目文件夾')
            # 執行使用\n分割的多行命令
            stdin, stdout, stderr = client.exec_command('\n'.join(arrComm))
            stdout.readlines() # 要執行這句 要否則就快速關閉了
            client.close()測試

 

           來個效果圖

相關文章
相關標籤/搜索