Fabric – 通過 SSH 來自動化管理 Linux 任務和布署應用
Fabric 是一個用 Python 編寫的命令行工具庫,它可以幫助系統管理員高效地執行某些任務,比如通過 SSH 到多台機器上執行某些命令,遠程布署應用等。
在使用之前,如果你擁有使用 Python 的經驗能幫你更好的使用 Fabric。當然,如果沒有那也不影響使用 Fabric。
我們為什麼要選擇 Fabric:
- 簡單
- 完備的文檔
- 如果你會 Python,不用增加學習其他語言的成本
- 易於安裝使用
- 使用便捷
- 支持多台機器並行操作
在 Linux 上如何安裝 Fabric
Fabric 有一個特點就是要遠程操作的機器只需要支持標準的 OpenSSH 服務即可。只要保證在機器上安裝並開啟了這個服務就能使用 Fabric 來管理機器。
依賴
- Python 2.5 或更新版本,以及對應的開發組件
- Python-setuptools 和 pip(可選,但是非常推薦)gcc
我們推薦使用 pip 安裝 Fabric,但是你也可以使用系統自帶的包管理器如 yum
, dnf
或 apt-get
來安裝,包名一般是 fabric
或 python-fabric
。
如果是基於 RHEL/CentOS 的發行版本的系統,你可以使用系統自帶的 EPEL 源 來安裝 fabric。
# yum install fabric [適用於基於 RedHat 系統]
# dnf install fabric [適用於 Fedora 22+ 版本]
如果你是 Debian 或者其派生的系統如 Ubuntu 和 Mint 的用戶,你可以使用 apt-get 來安裝,如下所示:
# apt-get install fabric
如果你要安裝開發版的 Fabric,你需要安裝 pip 來安裝 master 分支上最新版本。
# yum install python-pip [適用於基於 RedHat 系統]
# dnf install python-pip [適用於Fedora 22+ 版本]
# apt-get install python-pip [適用於基於 Debian 系統]
安裝好 pip 後,你可以使用 pip 獲取最新版本的 Fabric。
# pip install fabric
如何使用 Fabric 來自動化管理 Linux 任務
現在我們來開始使用 Fabric,在之前的安裝的過程中,Fabric Python 腳本已經被放到我們的系統目錄,當我們要運行 Fabric 時輸入 fab
命令即可。
在本地 Linux 機器上運行命令行
按照慣例,先用你喜歡的編輯器創建一個名為 fabfile.py 的 Python 腳本。你可以使用其他名字來命名腳本,但是就需要指定這個腳本的路徑,如下所示:
# fabric --fabfile /path/to/the/file.py
Fabric 使用 fabfile.py
來執行任務,這個文件應該放在你執行 Fabric 命令的目錄裡面。
例子 1:創建入門的 Hello World
任務:
# vi fabfile.py
在文件內輸入如下內容:
def hello():
print('Hello world, Tecmint community')
保存文件並執行以下命令:
# fab hello
Fabric 工具使用說明
例子 2:新建一個名為 fabfile.py 的文件並打開:
粘貼以下代碼至文件:
#! /usr/bin/env python
from fabric.api import local
def uptime():
local('uptime')
保存文件並執行以下命令:
# fab uptime
Fabric: 檢查系統運行時間
讓我們看看這個例子,fabfile.py 文件在本機執行了 uptime 這個命令。
在遠程 Linux 機器上運行命令來執行自動化任務
Fabric API 使用了一個名為 env
的關聯數組(Python 中的詞典)作為配置目錄,來儲存 Fabric 要控制的機器的相關信息。
env.hosts
是一個用來存儲你要執行 Fabric 任務的機器的列表,如果你的 IP 地址是 192.168.0.0,想要用 Fabric 來管理地址為 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' ]
上面這幾行代碼只是聲明了你要執行 Fabric 任務的主機地址,但是實際上並沒有執行任何任務,下面我們就來定義一些任務。Fabric 提供了一系列可以與遠程伺服器交互的方法。
Fabric 提供了眾多的方法,這裡列出幾個經常會用到的:
- run - 可以在遠程機器上運行的 shell 命令
- local - 可以在本機上運行的 shell 命令
- sudo - 使用 root 許可權在遠程機器上運行的 shell 命令
- get - 從遠程機器上下載一個或多個文件
- put - 上傳一個或多個文件到遠程機器
例子 3:在多台機子上輸出信息,新建新的 fabfile.py 文件如下所示
#!/usr/bin/env python
from fabric.api import env, run
env.hosts = ['192.168.0.2','192.168.0.6']
def echo():
run("echo -n 'Hello, you are tuned to Tecmint ' ")
運行以下命令執行 Fabric 任務
# fab echo
fabric: 自動在遠程 Linux 機器上執行任務
例子 4:你可以繼續改進之前創建的執行 uptime 任務的 fabfile.py 文件,讓它可以在多台伺服器上運行 uptime 命令,也可以檢查其磁碟使用情況,如下所示:
#!/usr/bin/env python
from fabric.api import env, run
env.hosts = ['192.168.0.2','192.168.0.6']
def uptime():
run('uptime')
def disk_space():
run('df -h')
保存並執行以下命令
# fab uptime
# fab disk_space
Fabric:自動在多台伺服器上執行任務
在遠程伺服器上自動化布署 LAMP
例子 5:我們來嘗試一下在遠程伺服器上布署 LAMP(Linux, Apache, MySQL/MariaDB and PHP)
我們要寫個函數在遠程使用 root 許可權安裝 LAMP。
在 RHEL/CentOS 或 Fedora 上
#!/usr/bin/env python
from fabric.api import env, run
env.hosts = ['192.168.0.2','192.168.0.6']
def deploy_lamp():
run ("yum install -y httpd mariadb-server php php-mysql")
在 Debian/Ubuntu 或 Linux Mint 上
#!/usr/bin/env python
from fabric.api import env, run
env.hosts = ['192.168.0.2','192.168.0.6']
def deploy_lamp():
sudo("apt-get install -q apache2 mysql-server libapache2-mod-php5 php5-mysql")
保存並執行以下命令:
# fab deploy_lamp
註:由於安裝時會輸出大量信息,這個例子我們就不提供屏幕 gif 圖了
現在你可以使用 Fabric 和上文例子所示的功能來自動化的管理 Linux 伺服器上的任務了。
一些 Fabric 有用的選項
- 你可以運行
fab -help
輸出幫助信息,裡面列出了所有可以使用的命令行信息 –fabfile=PATH
選項可以讓你定義除了名為 fabfile.py 之外的模塊- 如果你想用指定的用戶名登錄遠程主機,請使用
-user=USER
選項 - 如果你需要密碼進行驗證或者 sudo 提權,請使用
–password=PASSWORD
選項 - 如果需要輸出某個命令的詳細信息,請使用
–display=命令名
選項 - 使用
--list
輸出所有可用的任務 - 使用
--list-format=FORMAT
選項能格式化-list
選項輸出的信息,可選的有 short、normal、 nested --config=PATH
選項可以指定讀取配置文件的地址-–colorize-errors
能顯示彩色的錯誤輸出信息--version
輸出當前版本
總結
Fabric 是一個強大並且文檔完備的工具,對於新手來說也能很快上手,閱讀提供的文檔能幫助你更好的了解它。如果你在安裝和使用 Fabric 時發現什麼問題可以在評論區留言,我們會及時回復。
參考:Fabric 文檔
via: http://www.tecmint.com/automating-linux-system-administration-tasks/
作者:Aaron Kili 譯者:NearTan 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive