如何高效地遠端部署?自動化運維利器 Fabric 教程

zjq304110發表於2020-12-19

關於 Python 自動化的話題,在上一篇文章中,我介紹了 Invoke 庫,它是 Fabric 的最重要元件之一。Fabric 也是一個被廣泛應用的自動化工具庫,是不得不提的自動化運維利器,所以,本文將來介紹一下它。

Fabric 主要用在應用部署與系統管理等任務的自動化,簡單輕量級,提供有豐富的 SSH 擴充套件介面。在 Fabric 1.x 版本中,它混雜了本地及遠端兩類功能;但自 Fabric 2.x 版本起,它分離出了獨立的 Invoke 庫,來處理本地的自動化任務,而 Fabric 則聚焦於遠端與網路層面的任務。

為了做到這點,Fabric 主要依賴另一大核心元件 Paramiko,它是基於 SSH 協議的遠端控制模組,Fabric 在其基礎上封裝出了更加友好的介面,可以遠端執行 Shell 命令、傳輸檔案、批量操作伺服器、身份認證、多種配置與設定代理,等等。

一、Fabric 的版本區分
Python 2 版本已經被官宣在今年元旦“退休”了,未來只會是 Python 3 的舞臺。為了適應 Python 版本的非相容性遷移,很多專案也必須推出自己的新版本(相容或只支援 Python 3),其中就包括本文的主角 Fabric。

Fabric 自身存在著 2 個大版本:Fabric 1 和 Fabric 2,而在這個庫的基礎上,還有兩個很容易混淆的相關庫:Fabric2 和 Fabric3(注意這裡的數字是庫名的一部分)。

它們的區分如下:

Fabric 1.x:支援 Python 2.5-2.7,但不支援 Python 3
Fabric 2.x:支援 Python 2.7 與 3.4+,但不相容 Fabric 1.x 的 fabfile
Fabric2:等同於 Fabric 2.x,為了使不同版本共存(裝一個 1.x 舊版本,再裝它作為新版本)
Fabric3:一個基於 Fabric 1.x 的 fork(非官方),相容 Python 2&3,相容 Fabric1.x 的 fabfile
綜上可見,我們推薦使用官方的 Fabric 2.x 系列版本,但同時要注意,某些過時的教程可能是基於早期版本的(或非官方的 Fabric3,也是基於 Fabric 1.x),需要注意識別。

例如,在 Fabric 1.x 系列中這麼寫匯入:from fabric.api import run;在新版本中將報錯:“ImportError: No module named api”(PS:可根據是否有 fabric.api 來判斷 Fabric 的版本,就像在 Python 中根據 print 語句或 print 函式來判斷版本一樣)。同時,由於新版本不支援老版本的 fabfile,在使用時就可能報錯:“No idea what 'xxx' is!”

Fabric 2 是非相容性版本,相比於前個版本,它主要改進的點有:

支援 Python 2.7 與 3.4+
執行緒安全,取消了多程式的併發實現
API 圍繞 fabric.connection.Connection 進行了重組
全面修改了命令列解析器,允許在每個任務的基礎上使用規則的 GNU/POSIX 風格的標誌和選項(不再需要 fab mytask:weird = custom,arg = format)
可以宣告前置任務與後置任務
……(官方列了10幾條 [1],本文不一一羅列)
之前介紹過的 invoke,就是在開發 Fabric 2 時被分離出來的,具體的原因可參見這個回答 [2]。總而言之,在使用 Fabric 時,應該注意版本差異的問題。

二、Fabric 的基本用法
1、安裝
首先是安裝:pip intall fabric ,安裝後,可在命令列視窗檢視版本資訊:

>>> fab -V
Fabric 2.5.0
Paramiko 2.7.1
Invoke 1.4.0
執行“fab -V”,以上結果可看出我安裝的是 Fabric 2.5.0 版本,同時可看到它的兩個核心依賴庫 Paramiko 及 Invoke 的版本資訊。

2、一個簡單的例子
Fabric 主要用於遠端任務,即要對遠端伺服器進行操作,下面是一個簡單的例子:

# 可使用任意的檔名
from fabric import Connection

host_ip = '47.xx.xx.xx'  # 伺服器地址
user_name = 'root' # 伺服器使用者名稱
password = '****'  # 伺服器密碼
cmd = 'date'  # shell 命令,查詢伺服器上的時間

con = Connection(host_ip, user_name, connect_kwargs={'password': password})
result = con.run(cmd, hide=True)

print(result)
以上程式碼,通過賬號+密碼登入到遠端伺服器,然後執行date命令,檢視伺服器的時間,執行結果:

Command exited with status 0.
=== stdout ===
Fri Feb 14 15:33:05 CST 2020

(no stderr)
現在列印的結果中,除了伺服器時間,還有一些無關的資訊。這是因為它列印的“result”是一個"fabric.runners.Result"類,我們可以把其中的資訊解析出來

groups.tianya.cn/post-5311-f3fc8754ed0140be9531816826dde718-1.shtml
groups.tianya.cn/post-5311-acf068b966314398abe76a3598b308f6-1.shtml
groups.tianya.cn/post-5311-9c6af9c9a2754122aacdd2a762467323-1.shtml
groups.tianya.cn/post-5311-0a2c1367cf9d4c0d9955fb99866f30b0-1.shtml
groups.tianya.cn/post-5311-7012c685fa3c4dc5b571fa7e14d79080-1.shtml
groups.tianya.cn/post-5311-eb2c5e661b7f46c9808081e3544b6f78-1.shtml
groups.tianya.cn/post-5311-a6d6fada86a34a3f935ff4d5b2c351b3-1.shtml
groups.tianya.cn/post-5311-3f123ac0e7014dfdaec926343d8ffc6d-1.shtml
groups.tianya.cn/post-5311-723933acd37146e7b5e46125ffdebdf3-1.shtml
groups.tianya.cn/post-5311-1f2a87cd27b54c048bdf5e3d140136d2-1.shtml
groups.tianya.cn/post-5311-409e236db58f400ebc521ff3d114504a-1.shtml
groups.tianya.cn/post-5311-b37b909c15944fab8c5fa99e963a9d87-1.shtml
groups.tianya.cn/post-5311-a28620d8c0f4487eb24889dc4e5bfe77-1.shtml
groups.tianya.cn/post-5311-fdc61188fb4b41b78090ebebd87bd856-1.shtml
groups.tianya.cn/post-5311-3395911f8a99448ca4388975e3df1079-1.shtml
groups.tianya.cn/post-5311-f6bc803a97c94f9da9b2ba015f281fa7-1.shtml
groups.tianya.cn/post-5311-fe18cf44c1984503a87bb7694e5c3ee4-1.shtml
groups.tianya.cn/post-5311-f17dbbd754be47aab8bd9e053e59db8b-1.shtml
groups.tianya.cn/post-5311-de7989ead4744523aa3e68e21cab23a3-1.shtml
groups.tianya.cn/post-5311-2852da33f83348c88f0c5f71f918f1c3-1.shtml
groups.tianya.cn/post-5311-10c37913b2f440839e268b09a25fa094-1.shtml
groups.tianya.cn/post-5311-abe8883c27ce487e8ac8f48d42e01065-1.shtml
groups.tianya.cn/post-5311-b1adbb0ff2ce4bdbb35a6388607832e7-1.shtml
groups.tianya.cn/post-5311-61bee67dfa764a5e834498eee1936c37-1.shtml
groups.tianya.cn/post-5311-4e67686110754f5c8da2546c8b0abfc9-1.shtml
groups.tianya.cn/post-5311-8008d41fbb894275ab8d06ee5655aca7-1.shtml
groups.tianya.cn/post-5311-e05bbca7ef7f449bbc984b50c7a5301d-1.shtml
groups.tianya.cn/post-5311-c429807f103f41ef9e3e0a963d746760-1.shtml
groups.tianya.cn/post-5311-baa46d0e707748f9abf1c087f651b2b0-1.shtml
 

相關文章