Fabric 讓 Linux 系統部署變得簡單
文/圖:曹江華
傳統上要管理遠端的 Linux 伺服器,到目前為止使用 SSH 仍然是最好的方法。然而 SSH 主要用途是執行簡單的命令,面對較複雜的狀況,便難以自動化地管理 Linux。本文介紹的 Fabric,正是針對 SSH 這些缺點而開發出來的遠端管理工具。
Fabric 是一個使用了 Python 2.5-2.7 的函式庫和命令行工具,用來提高基於 SSH 的應用部署和系統管理效率。Fabric 簡化了 SSH 的應用程式部署及系統管理任務,它提供了系統基礎的操作組件,可以實現本地或遠程 Shell 命令,包括命令執行、檔案上傳下載及完整執行日誌輸出等功能。Fabric 在 Paramiko 的基礎上,做了更高一層的封裝,讓用戶操作起來會更加簡單。
Fabric 的特點
Fabric 在官方文件中提到,其程式碼可讀性強,完全是 Python 語言,它封裝了本地及遠程操作,用戶可以根據需求靈活的定義參數,並進行角色定義,方便批量管理。不少用戶經常把 Fabric 和另外一個自動化伺服器設定管理工具 Chef 比較,事實上 Chef 與 Fabric 不同之處在於前者由 Ruby 1.9 開發,後者由 Python 2.5-2.7 開發,Chef 在設定中心伺服器要依賴軟體比較多,需要 couchdb、RabbitMQ 和 Solr,連帶還需要安裝 Java 和 erlang,這樣設定伺服器過程要複雜很多。Fabic 的好處是安裝簡單,需要的支援軟體也少。
安裝套件
Fabric 安裝前,系統需要安裝 Python 2.5 或更新版本,以及對應的開發組件,包括 Python-setuptools 和 pip、gcc,以及 OpenSSH。對於基於 Red Hat Enterprise Linux(RHEL) 或 CentOS 的Linux 版本,可以使用系統自帶的企業版本 Linux 額外套件 EPEL 來源來安裝 Fabric。
yum install fabric (ENTER)
如果是 Debian 或者其派生的 Linux 系統例如 Ubuntu 的用戶,則可以使用 apt-get 來安裝。
apt-get install fabric (ENTER)
如果使用 RHEL 或 CentOS,也可透過安裝 pip 來安裝 Fabric 最新版本。
yum install python-pip (ENTER)
安裝好 pip 後,便可以使用 pip 來取得最新版本的 Fabric。
pip install fabric (ENTER)
使用如下命令測試安裝是否成功,如果顯示出版本說明安裝成功(圖1)。
python -c “from fabric.api import * ; print env.version” (ENTER)

使用說明
我們首先要建立一個 Fabfile,Fabfile 用於指定 Fabric 執行的命令,它通常被命名為 fabfile.py,並使用 fab 命令運行。在之前的安裝的過程中,Fabric Python 腳本已經被放到我們的系統目錄,因此當我們要運行 Fabric 時,只要輸入 fab 命令即可。用喜歡的編輯器如 vi 或者 gedit 建立一個名為 fabfile.py 的 Python 腳本,當然我們也可以使用其他名字來命名腳本,但是就需要指定這個腳本的路徑,如下所示。
fabric -f /path/file.py (ENTER)
Fabric 使用腳本檔案 fabfile.py 來執行任務,這個檔案應該放在 Fabric 命令的目錄裡面,fab 命令的
命令格式如下。
fab [options] <command>[:arg1,arg2=val2,host=foo,hosts=’h1;h2′,…]
表 1 顯示的是 fab 的常用參數。
參數 | 意義 |
---|---|
-l | 顯示可用的命令 (Task)。 |
-f | 指定 fab 入口檔案,fab 預設入口檔案是 fabfile/fabfile.py。 |
-H | 指定目標主機,多台主機可用逗號「,」號分隔。 |
-p | 遠程帳號的密碼,fab執行時預設使用root帳號。 |
-P | 以異步並行方式運行多主機任務,預設為串列式運行。 |
-R | 指定角色(Role),以角色名區分不同業務群組設備。 |
-t | 設置設備連接超時時間,以秒為單位。 |
-T/ | 設置遠程主機命令執行逾時時間,以秒為單位。 |
-w | 當命令執行失敗,發出警告,而非預設中止任務。 |
表1:fab 的常用參數。
應用實例
下面是一個顯示 hello world 的例子,先新建一個 py 腳本 fabfile.py,內容如下。
def hello():
print(“Hello world!”)
完成後執行以下命令(圖2)。
fab hello (ENTER)
Hello world!
Done.
下面的例子是屬於fab命令進行運程操作,查看遠程主機 10.0.2.15 的系統負載(圖3)。
fab -H 10.0.2.15 -p $password -P –uptime (ENTER)
uptime 命令用於查看伺服器運行了多長時間以及有多少個用戶登入,快速獲知伺服器的負荷情況。


fabfile 檔案的編寫
fabfile 中的 env 對象的作用是,定義 fabfile 的全局設定。Fabric API 使用了一個名為env的關聯數組,即 Python 中的詞典作為設定目錄,來儲存 Fabric 要控制的機器的相關資訊。其中 env.hosts 用來定義目標主機,可以用 IP 位址或主機名稱表示,env.hosts 是一個用來儲存要執行 Fabric 任務的機器的列表,如果你的 IP 位址是 192.168.0.0,想要用 Fabric 來管理 IP 位址為192.168.0.2 和 192.168.0.6 的電腦,設定清單如下。
#!/usr/bin/env python
from fabric.api import env
env.hosts = [‘192.168.0.2’, ‘192.168.0.6’]
env.exclude_hosts 用來排除指定主機,例子如下。
env.exclude_hosts=[‘192.168.1.21’]
env.user 用來定義用戶名稱,例如 env.user=’root’。env.port 用來定義埠號,預設為 22,可設定為 env.port=’22’。env.password 用來定義密碼,例子如下。
env.password=’123456′
env.passwords 可定義多個密碼,不同主機對應不同密碼。
env.passwords = {‘root@192.168.1.21:22′:’123456′,’root@192.168.1.22:22′:’654321’}
env.gateway 可定義網關 IP 位址。
env.gateway=’192.168.1.23 ‘
env.roledefs 用來定義角色分組,比如 web 組合 db 組主機區分開來。
env.roledefs = {‘webserver’:[‘192.168.1.21′,’192.168.1.22′],’dbserver’:[‘192.168.1.25′,’192.168.1.26’]}
env.deploy_release_dir 可自定義全局變量,格式如下。
env. + ‘變量名稱’
例如 env.age 和 env.sex 等便是變量名稱,env.roledefs 可用作角色管理。