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)

圖1:顯示 Fabric 版本編號。
圖1:顯示 Fabric 版本編號。

使用說明

我們首先要建立一個 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 命令用於查看伺服器運行了多長時間以及有多少個用戶登入,快速獲知伺服器的負荷情況。

圖2:Fabric 執行 hello world 時的狀況
圖2:Fabric 執行 hello world 時的狀況

 

圖3:執行遠程操作。
圖3:執行遠程操作。

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 可用作角色管理。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *