Fabric:通過(guò)SSH來(lái)自動(dòng)化管理Linux任務(wù)和布署應(yīng)用
當(dāng)要管理遠(yuǎn)程機(jī)器或者要布署應(yīng)用時(shí),雖然你有多種命令行工具可以選擇,但是其中很多工具都缺少詳細(xì)的使用文檔。
在這篇教程中,我們將會(huì)一步一步地向你介紹如何使用 fabric 來(lái)幫助你更好得管理多臺(tái)服務(wù)器。
Fabric 是一個(gè)用 Python 編寫(xiě)的命令行工具庫(kù),它可以幫助系統(tǒng)管理員高效地執(zhí)行某些任務(wù),比如通過(guò) SSH 到多臺(tái)機(jī)器上執(zhí)行某些命令,遠(yuǎn)程布署應(yīng)用等。
在使用之前,如果你擁有使用 Python 的經(jīng)驗(yàn)?zāi)軒湍愀玫氖褂?Fabric。當(dāng)然,如果沒(méi)有那也不影響使用 Fabric。
我們?yōu)槭裁匆x擇 Fabric:
- 簡(jiǎn)單
- 完備的文檔
- 如果你會(huì) Python,不用增加學(xué)習(xí)其他語(yǔ)言的成本
- 易于安裝使用
- 使用便捷
- 支持多臺(tái)機(jī)器并行操作
在 Linux 上如何安裝 Fabric
Fabric 有一個(gè)特點(diǎn)就是要遠(yuǎn)程操作的機(jī)器只需要支持標(biāo)準(zhǔn)的 OpenSSH 服務(wù)即可。只要保證在機(jī)器上安裝并開(kāi)啟了這個(gè)服務(wù)就能使用 Fabric 來(lái)管理機(jī)器。
依賴
- Python 2.5 或更新版本,以及對(duì)應(yīng)的開(kāi)發(fā)組件
- Python-setuptools 和 pip(可選,但是非常推薦)gcc
我們推薦使用 pip 安裝 Fabric,但是你也可以使用系統(tǒng)自帶的包管理器如 yum, dnf 或 apt-get 來(lái)安裝,包名一般是fabric 或 python-fabric。
如果是基于 RHEL/CentOS 的發(fā)行版本的系統(tǒng),你可以使用系統(tǒng)自帶的 EPEL 源 來(lái)安裝 fabric。
- # yum install fabric [適用于基于 RedHat 系統(tǒng)]
- # dnf install fabric [適用于 Fedora 22+ 版本]
如果你是 Debian 或者其派生的系統(tǒng)如 Ubuntu 和 Mint 的用戶,你可以使用 apt-get 來(lái)安裝,如下所示:
- # apt-get install fabric
如果你要安裝開(kāi)發(fā)版的 Fabric,你需要安裝 pip 來(lái)安裝 master 分支上***版本。
- # yum install python-pip [適用于基于 RedHat 系統(tǒng)]
- # dnf install python-pip [適用于Fedora 22+ 版本]
- # apt-get install python-pip [適用于基于 Debian 系統(tǒng)]
安裝好 pip 后,你可以使用 pip 獲取***版本的 Fabric。
- # pip install fabric
如何使用 Fabric 來(lái)自動(dòng)化管理 Linux 任務(wù)
現(xiàn)在我們來(lái)開(kāi)始使用 Fabric,在之前的安裝的過(guò)程中,F(xiàn)abric Python 腳本已經(jīng)被放到我們的系統(tǒng)目錄,當(dāng)我們要運(yùn)行 Fabric 時(shí)輸入 fab 命令即可。
在本地 Linux 機(jī)器上運(yùn)行命令行
按照慣例,先用你喜歡的編輯器創(chuàng)建一個(gè)名為 fabfile.py 的 Python 腳本。你可以使用其他名字來(lái)命名腳本,但是就需要指定這個(gè)腳本的路徑,如下所示:
- # fabric --fabfile /path/to/the/file.py
Fabric 使用 fabfile.py 來(lái)執(zhí)行任務(wù),這個(gè)文件應(yīng)該放在你執(zhí)行 Fabric 命令的目錄里面。
例子 1:創(chuàng)建入門(mén)的 Hello World 任務(wù):
- # vi fabfile.py
在文件內(nèi)輸入如下內(nèi)容:
- def hello():
- print('Hello world, Tecmint community')
保存文件并執(zhí)行以下命令:
- # fab hello
Fabric 工具使用說(shuō)明
例子 2:新建一個(gè)名為 fabfile.py 的文件并打開(kāi):
粘貼以下代碼至文件:
- #! /usr/bin/env python
- from fabric.api import local
- def uptime():
- local('uptime')
保存文件并執(zhí)行以下命令:
- # fab uptime
Fabric: 檢查系統(tǒng)運(yùn)行時(shí)間
讓我們看看這個(gè)例子,fabfile.py 文件在本機(jī)執(zhí)行了 uptime 這個(gè)命令。
在遠(yuǎn)程 Linux 機(jī)器上運(yùn)行命令來(lái)執(zhí)行自動(dòng)化任務(wù)
Fabric API 使用了一個(gè)名為 env 的關(guān)聯(lián)數(shù)組(Python 中的詞典)作為配置目錄,來(lái)儲(chǔ)存 Fabric 要控制的機(jī)器的相關(guān)信息。
env.hosts 是一個(gè)用來(lái)存儲(chǔ)你要執(zhí)行 Fabric 任務(wù)的機(jī)器的列表,如果你的 IP 地址是 192.168.0.0,想要用 Fabric 來(lái)管理地址為 192.168.0.2 和 192.168.0.6 的機(jī)器,需要的配置如下所示:
- #!/usr/bin/env python
- from fabric.api import env
- env.hosts = [ '192.168.0.2', '192.168.0.6' ]
上面這幾行代碼只是聲明了你要執(zhí)行 Fabric 任務(wù)的主機(jī)地址,但是實(shí)際上并沒(méi)有執(zhí)行任何任務(wù),下面我們就來(lái)定義一些任務(wù)。Fabric 提供了一系列可以與遠(yuǎn)程服務(wù)器交互的方法。
Fabric 提供了眾多的方法,這里列出幾個(gè)經(jīng)常會(huì)用到的:
- run - 可以在遠(yuǎn)程機(jī)器上運(yùn)行的 shell 命令
- local - 可以在本機(jī)上運(yùn)行的 shell 命令
- sudo - 使用 root 權(quán)限在遠(yuǎn)程機(jī)器上運(yùn)行的 shell 命令
- get - 從遠(yuǎn)程機(jī)器上下載一個(gè)或多個(gè)文件
- put - 上傳一個(gè)或多個(gè)文件到遠(yuǎn)程機(jī)器
例子 3:在多臺(tái)機(jī)子上輸出信息,新建新的 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 ' ")
運(yùn)行以下命令執(zhí)行 Fabric 任務(wù)
- # fab echo
fabric: 自動(dòng)在遠(yuǎn)程 Linux 機(jī)器上執(zhí)行任務(wù)
例子 4:你可以繼續(xù)改進(jìn)之前創(chuàng)建的執(zhí)行 uptime 任務(wù)的 fabfile.py 文件,讓它可以在多臺(tái)服務(wù)器上運(yùn)行 uptime 命令,也可以檢查其磁盤(pán)使用情況,如下所示:
- #!/usr/bin/env pythonfrom fabric.api import env, runenv.hosts = ['192.168.0.2','192.168.0.6']def uptime(): run('uptime')def disk_space(): run('df -h')
保存并執(zhí)行以下命令
- # fab uptime# fab disk_space
Fabric:自動(dòng)在多臺(tái)服務(wù)器上執(zhí)行任務(wù)
在遠(yuǎn)程服務(wù)器上自動(dòng)化布署 LAMP
例子 5:我們來(lái)嘗試一下在遠(yuǎn)程服務(wù)器上布署 LAMP(Linux, Apache, MySQL/MariaDB and PHP)
我們要寫(xiě)個(gè)函數(shù)在遠(yuǎn)程使用 root 權(quán)限安裝 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")
保存并執(zhí)行以下命令:
- # fab deploy_lamp
注:由于安裝時(shí)會(huì)輸出大量信息,這個(gè)例子我們就不提供屏幕 gif 圖了
現(xiàn)在你可以使用 Fabric 和上文例子所示的功能來(lái)自動(dòng)化的管理 Linux 服務(wù)器上的任務(wù)了。
一些 Fabric 有用的選項(xiàng)
- 你可以運(yùn)行 fab -help 輸出幫助信息,里面列出了所有可以使用的命令行信息
- –fabfile=PATH 選項(xiàng)可以讓你定義除了名為 fabfile.py 之外的模塊
- 如果你想用指定的用戶名登錄遠(yuǎn)程主機(jī),請(qǐng)使用 -user=USER 選項(xiàng)
- 如果你需要密碼進(jìn)行驗(yàn)證或者 sudo 提權(quán),請(qǐng)使用 –password=PASSWORD 選項(xiàng)
- 如果需要輸出某個(gè)命令的詳細(xì)信息,請(qǐng)使用 –display=命令名 選項(xiàng)
- 使用 --list 輸出所有可用的任務(wù)
- 使用 --list-format=FORMAT 選項(xiàng)能格式化 -list 選項(xiàng)輸出的信息,可選的有 short、normal、 nested
- --config=PATH 選項(xiàng)可以指定讀取配置文件的地址
- -–colorize-errors 能顯示彩色的錯(cuò)誤輸出信息
- --version 輸出當(dāng)前版本
總結(jié)
Fabric 是一個(gè)強(qiáng)大并且文檔完備的工具,對(duì)于新手來(lái)說(shuō)也能很快上手,閱讀提供的文檔能幫助你更好的了解它。如果你在安裝和使用 Fabric 時(shí)發(fā)現(xiàn)什么問(wèn)題可以在評(píng)論區(qū)留言,我們會(huì)及時(shí)回復(fù)。