python三大神器之fabric

王希知發表於2019-06-09

Fabric

Fabric是一個python的遠端執行shell的庫,同時它也是一個命令列工具。它提供了豐富的同 SSH 互動的介面,可以用來在本地或遠端機器上自動化、流水化地執行 Shell 命令。

安裝Fabric

Fabric的官網是 www.fabfile.org,原始碼託管在Github上。你可以clone原始碼到本地,然後通過下面的命令來安裝。但是在原始碼安裝前,你必須先將Fabric的依賴包Paramiko裝上。

 
python setup.py develop

 

同時也可以使用pip安裝,因為fabric是python的一個第三方庫,只需一條命令即可:

 pip install fabric

 

python3 安裝時使用的是fabric3 :( 安裝fabric3之前,需要先解除安裝fabric.)

  1. # fabric3 支援 python3

  2. pip uninstall fabric

  3. pip3 install fabric3

fabric 不只是一個Python 模組,fabric 還是一個命令列工具,可以使用fab -h檢視幫助資訊

 
E:\my_data\hk-project>fab -V
Fabric3 1.14.post1
Paramiko 2.4.2
E:\my_data\hk-project>fab -h

 

入門使用

fabric的使用方式是通過編寫一個python檔案,該檔案中包含多個函式,然後使用fab命令呼叫這些函式,做相應的任務。這些函式在fabric中稱為task。

# filename:abc.py
from fabric.api import *def task1():
     print("hello")
     
 def hello():
     print("hello world")

寫好這個python檔案後,在當前目錄的路徑下使用fab工具執行檔案中的函式

[root@localhost python檔案所在的目錄]# fab -f abc.py hello
 hello world
 ​
 # -f 指定fabfile檔案,預設為fabfile.py,若檔名是當前目錄下的fabfile.py則無需指定

任務引數

此時你可能會想,如果這個函式有引數怎麼辦呢?應該如何傳遞引數給函式呢?Fabric 支援 Shell 相容的引數用法: <任務名>:<引數>, <關鍵字引數名>=<引數值>,... 用起來就是這樣。

 def hello(name="world"):
     print("hello {}".format(name))

我們可以這樣去指定引數 

$ fab hello:name=Jeff   # 或者 fab hello:Jeff
 hello Jeff
 ​
 Done.

小試牛刀

現在我們假設需要寫一個fabfile.py,能夠在每次web專案程式碼更新後使用git提交併遠端伺服器拉去最新程式碼並執行,需求描述清楚了,開幹吧!

 
# fabfile.py
 # 這裡建議將該檔案放入專案檔案的根目錄中,方便git提交
from fabric.api import local
 ​
 def test():
     local('python manage.py test myapp')
     # 測試是否能正常執行
     
 def commit():
     local('git add -p && git commit -m "for test"')
     
 def push():
     local('git push')
    
 def prepare_deploy():
     test()
     commit()
     push()

這個 prepare_deploy 任務可以單獨呼叫,也可以呼叫更細粒度的子任務。

故障

Fabric 會檢查被呼叫程式的返回值,如果這些程式沒有乾淨地退出,Fabric 會終止操作。我們什麼都不用做,Fabric 檢測到了錯誤並終止,不會繼續執行 commit 任務。

我們也可以對故障進行一定的處理和判斷

from fabric.api import local, settings, abort
 from fabric.contrib.console import confirm
 ​
 def test():
     with settings(warn_only=True):
         result = local('./manage.py test my_app', capture=True) 
         # result.return_code返回碼(0/1)和result.failed
     if result.failed and not confirm("Tests failed. Continue anyway?"): # confirm判斷使用者輸入
         abort("Aborting at user request.")  # 指定錯誤退出資訊
         
 # 一個名為 warn_only 的設定(或著說 環境變數 ,通常縮寫為 env var )可以把退出換為警告,以提供更靈活的錯誤處理。如果設定為False,則一條命令執行失敗會就會退出,不再執行後面的命令。

建立連線

終於到了連線了,這個工具主要作用就是在遠端執行命令呀,學會了這個,我們就可以在本地執行遠端伺服器的命令了。

from fabric.api import *
 ​
 env.hosts = ['root@192.168.10.11:22']
 ​
 def deploy():
     run('ls')  # run()用於執行遠端命令,local()執行本地命令
     
 # 執行後會提示你輸入密碼,輸入密碼即可

至此,入門結束,後續還有更多api的講解,敬請關注!

參考連結:

fabric官方中文文件:https://fabric-chs.readthedocs.io/zh_CN/chs/tutorial.html

Python 遠端部署利器 Fabric 模組詳解:https://blog.csdn.net/freeking101/article/details/81103945

 

相關文章