python自動化遠程部署-fabric


項目發布部署時,往往需要花大量的時間去ssh多台機器,然后逐一敲重復的命令,同樣的操作和同樣的命令反復做,作為一個程序員是不能忍受的,這也是自動化存在的意義,可以大大節省不必要的時間,python做為一個腳本語言本身就有這方面的優勢,fabric 這個庫可以很好的偷懶,本文使用python3。
鏈接:https://www.jianshu.com/p/0147b2ad9993
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。

安裝

會安裝一大堆包,提示 Successfully installed 等字樣表示安裝成功,安裝完后,系統有一個 fab 命令可以使用。想要了解更多,看 官方文檔

sudo pip3 install fabric3

簡單示例

1、先見識一下使用效果,然后再看常用的一些命令
例一:執行遠程主機命令,查看主機操作系統, 'uname -o'
首先創建一個 check.py 文件

from fabric.api import run  # 導入api中的run
      
def look():     
     run('uname -o')        # 執行run函數,把用使用的命令傳入

然后使用 fab 命令執行,輸入目標主機用戶密碼后即可執行命令,並打印結果

fab -f check.py -H 127.0.0.1 'look'     # -f指定文件, -H 指定主機,這里我們直接用本地, look 是文件里面的任務函數名
輸出的結果如下:
 

這里只是一個小示例,當然不可能每個都自己手動輸入密碼,通過配置都可以完成自動化。

例二:多台遠程主機創建目錄 test 。

  1. 創建一個 mk_dir.py 文件:
from fabric.api import *
  
# 設置目標主機
env.hosts = ['192.168.139.139', '192.168.139.141']
# 設置多台主機用戶名及密碼
env.passwords = {
        'python@192.168.139.139:22': '12345678',     
        'python@192.168.139.141:22': '12345678'
    }
# 設置一個任務
@task
def start():
    run('mkdir test')
  1. 然后執行任務
fab -f mk_dir.py start      # start 是任務名
結果如下,可以在兩個主機的 python 用戶家目錄看到 test 文件夾,這樣就可以實現自動連接遠程主機,並執行相應的任務了。
 
例二執行結果

例三:打包本地文件,上傳到目標主機,並校驗 md5 ,然后解壓並執行這個文件(該例可以配合后面的命令說明測試)

場景:本地有一個 /home/python/test/test.py 文件,打包成 test.tar.gz ,上傳到目標主機的 /home/python/temp 目錄下,解壓並執行。

  1. 創建一個本地的test.py如下,用來上傳后執行:
print('===========')
print('hello world')
print('===========')
  1. 創建一個任務文件 uploadfile.py
from fabric.api import *
 
 
env.hosts = ['192.168.139.139', '192.168.139.141']
env.user = 'python'   # 多台主機用戶名密碼相同可以只寫一次
env.password = '12345678'
 
# 打包
@runs_once            # 該裝飾器表示只執行一次,沒有的話默認每台主機都執行一次
def task_tar():      # 該場景本地文件打包本身就只需要執行一次
    with lcd('/home/python/test'):
        local('tar zcvf test.tar.gz test.py')
 
# 上傳
def task_upload():
    run('mkdir -p /home/python/temp')
    put('/home/python/test/test.tar.gz', '/home/python/temp/test.tar.gz')
 
# 驗證md5
def task_md5():
    # 計算本地的md5
    local_md5 = local('md5sum /home/python/test/test.tar.gz', capture=True).split('  ')[0]
    # 計算遠程主機md5
    remote_md5 = run('md5sum /home/python/temp/test.tar.gz').split('  ')[0]
    print(local_md5)
    print(remote_md5)
    if remote_md5 == local_md5:
        print('上傳成功')
    else:
        print('上傳出錯')
 
# 解包並執行
def task_exc():
    with cd('/home/python/temp'):
        run('tar zxvf test.tar.gz')
        run('python3 test.py')
 
# 調度
@task
def start():
    task_tar()
    task_upload()
    task_md5()
    task_exc()
  1. 執行任務:
fab -f uploadfile.py start
  1. 屏幕輸出結果如下
[python@ubuntu Test]$ fab -f uploadfile.py start
[192.168.139.139] Executing task 'start'
[localhost] local: tar zcvf test.tar.gz test.py
test.py
[192.168.139.139] run: mkdir -p /home/python/temp
[192.168.139.139] put: /home/python/test/test.tar.gz -> /home/python/temp/test.tar.gz
[localhost] local: md5sum /home/python/test/test.tar.gz
[192.168.139.139] run: md5sum /home/python/temp/test.tar.gz
[192.168.139.139] out: d5e8f717b176270f4c1a4fa72493239a  /home/python/temp/test.tar.gz
[192.168.139.139] out: 
 
d5e8f717b176270f4c1a4fa72493239a
d5e8f717b176270f4c1a4fa72493239a
上傳成功
[192.168.139.139] run: tar zxvf test.tar.gz
[192.168.139.139] out: test.py
[192.168.139.139] out: 
 
[192.168.139.139] run: python3 test.py
[192.168.139.139] out: ===========
[192.168.139.139] out: hello world
[192.168.139.139] out: ===========
[192.168.139.139] out: 
 
[192.168.139.141] Executing task 'start'
[192.168.139.141] run: mkdir -p /home/python/temp
[192.168.139.141] put: /home/python/test/test.tar.gz -> /home/python/temp/test.tar.gz
[localhost] local: md5sum /home/python/test/test.tar.gz
[192.168.139.141] run: md5sum /home/python/temp/test.tar.gz
[192.168.139.141] out: d5e8f717b176270f4c1a4fa72493239a  /home/python/temp/test.tar.gz
[192.168.139.141] out: 
 
d5e8f717b176270f4c1a4fa72493239a
d5e8f717b176270f4c1a4fa72493239a
上傳成功
[192.168.139.141] run: tar zxvf test.tar.gz
[192.168.139.141] out: test.py
[192.168.139.141] out: 
 
[192.168.139.141] run: python3 test.py
[192.168.139.141] out: ===========
[192.168.139.141] out: hello world
[192.168.139.141] out: ===========
[192.168.139.141] out: 
 
 
Done.
Disconnecting from 192.168.139.139... done.
Disconnecting from 192.168.139.141... done.

常用命令

常用參數

  • -l : 列出指定文件的任務函數名,只有使用了裝飾器 @task 的才會列出
  • -H : 指定目標主機,多台主機用","號分割
  • -u:指定遠程用戶名
  • -f : 指定fab的任務文件,默認的任務文件名是fabfile.py,即文件直接命名 fabfile.py ,可以不用 -f 指定文件
  • -t:設置超時時間,單位秒
  • -V:查看版本

API

  • @task : 函數裝飾器,裝飾的函數fab才能調用
  • @runs_once : 函數裝飾器,裝飾的函數只執行一次
  • local : 執行本地命令,例:local('ls -la')
  • run : 執行遠程命令,例:run('ls -la')
  • lcd : 切換本地目錄,例:lcd('/home/python')
  • cd : 切換遠程目錄,例:cd('/home/python')
  • put : 上傳本地文件到遠程主機,例:put('test', '/home/python/')
  • get : 從遠程主機下載文件到本地,例:get('/home/python/test', './')
  • reboot : 重啟遠程主機,例:reboot()
  • sudo : sudo執行遠程命令,例:sudo('service nginx start')

主機設置

  • env.host : 設置目標主機
  • env.user : 設置用戶名
  • env.port : 設置目標主機端口,默認是22
  • env.password : 設置密碼
  • env.passwords : 設置多台主機不同的密碼。
作者:謙面客
鏈接:https://www.jianshu.com/p/0147b2ad9993
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM