項目發布部署時,往往需要花大量的時間去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 。
- 創建一個 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')
- 然后執行任務
fab -f mk_dir.py start # start 是任務名
例二執行結果
例三:打包本地文件,上傳到目標主機,並校驗 md5 ,然后解壓並執行這個文件(該例可以配合后面的命令說明測試)
場景:本地有一個 /home/python/test/test.py 文件,打包成 test.tar.gz ,上傳到目標主機的 /home/python/temp 目錄下,解壓並執行。
- 創建一個本地的test.py如下,用來上傳后執行:
print('===========') print('hello world') print('===========')
- 創建一個任務文件 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()
- 執行任務:
fab -f uploadfile.py start
- 屏幕輸出結果如下
[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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。
