1、什麼是fabrichtml
Fabric是一個Python(2.5-2.7)庫,用於簡化使用SSH的應用程序部署或系統管理任務的命令行工具。它提供的操做包括:執行本地或遠程shell命令,上傳/下載文件,以及其餘輔助功能,如提示用戶輸入、停止執行等操做。python
簡單來講,它能夠經過SSH在多個host上批量執行任務。你能夠編寫任務腳本,而後經過Fabric在本地就能夠使用SSH在大量遠程服務器上自動運行。這些功能很是適合應用的自動化部署,或者執行系統管理任務。web
2、先看一個例子,用fabric實現批量修改機器密碼:shell
編寫一個名字爲fabfile.py的腳本:vim
$ vim fabfile.pyapi
#!/usr/bin/env python # _*_ coding:utf-8 _*_ from fabric.api import run from fabric.context_managers import env #指定須要修改密碼的host env.hosts = ['10.13.25.2','10.13.25.3','10.13.25.4'] env.user = 'root' env.password = 'mypassword' env.parallel = True def chpasswd(): #用chpasswd修改用戶密碼 run("echo 'root:newpassword'| chpasswd")
執行:$fab chpasswd安全
會看到如下返回結果,執行完成修改爲功:bash
$ fab sysbench服務器 [10.13.25.2] Executing task 'sysbench'ide [10.13.25.3] Executing task 'sysbench' [10.13.25.4] Executing task 'sysbench' [10.13.25.4] run: echo 'root:newpassword'| chpasswd [10.13.25.3] run: echo 'root:newpassword'| chpasswd [10.13.25.2] run: echo 'root:newpassword'| chpasswd Done. |
會看到fabric的返回結果在前面都有相對應的IP地址,因爲env.parallel的值爲True,任務能夠在多臺機器上同時進行。
官方文檔中建議,爲了安全起見,最好是使用 SSH KEY 的方式來批量執行主機。
3、安裝
fabric的安裝很簡單,能夠直接用鏡像源中自帶的包;
E.g.:
$sudo apt-get install fabric
官方的建議用pip或者easy_install(老版本,尤可用),須要先裝python-pip;你也能夠直接下載源碼;
E.g.:
$sudo apt-get install python-pip $sudo pip install fabric
4、fabric的使用
一、Fabric有默認的執行文件名"fabfile.py",也能夠用-f參數指定;
E.g.:
fab -f chpasswd.py chpasswd
二、Fabric區分遠程目錄和本地目錄,fabric提供的對遠端和本地目錄的操做分別是cd和lcd,咱們能夠用普通用戶登錄上去pwd測試一下;
E.g.:$ vim fabfile.py
#!/usr/bin/env python from fabric.api import run from fabric.context_managers import env from fabric.context_managers import cd env.hosts = ['10.13.25.2','10.13.25.3','10.13.25.4'] env.user = 'xjx' env.password = 'xjx123' env.parallel = True def pwdtest(): run('pwd')
$ fab pwdtest
[10.13.25.2] Executing task 'pwdtest' [10.13.25.3] Executing task 'pwdtest' [10.13.25.4] Executing task 'pwdtest' [10.13.25.4] run: pwd [10.13.25.3] run: pwd [10.13.25.2] run: pwd [10.13.25.3] out: /home/xjx [10.13.25.3] out: [10.13.25.2] out: /home/xjx [10.13.25.2] out: [10.13.25.4] out: /home/xjx [10.13.25.4] out: Done. |
能夠看到默認登錄上去的路徑是home目錄,很容易被忽略這一點;若是想要切換目錄引入'cd'命令,以下使用;
E.g切換到/usr/local目錄:
with cd('/usr/local')
三、Fabric裏的任務就是一個python函數,既然是python函數,那麼對函數的一些用法也適用於任務函數。好比傳遞參數、互相調用、返回值等等;
def hello(name="world"): print("Hello %s!" % name)
在執行任務的時候,能夠經過fab的命令行參數爲任務函數傳遞參數:
$ fab hello:name=XJX
Hello XJX
四、環境字典
Fabric中經過一個Python字典的子類來設置環境,它是一個全局的單例 fabric.state.env ,包含在 fabric.api中。Fabric的大部分行爲能夠經過修改 env 變量來控制。若是不但願全局生效,能夠經過 settings 上下文管理器來改變代碼塊的環境設置。env 能夠像字典那樣使用,同時也支持按屬性方式訪問。env 變量的完整列表見官方文檔 Full list of env vars ,推薦使用 settings 和 cd 這樣的上下文管理器來修改它們。
五、定義主機列表
主機字符串就是 user@host:port 形式的字符串, user 和/或 port 能夠省略。 hosts 變量定義主機列表,還能夠用roledefs 分組定義主機。
from fabric.api import env env.roledefs = { 'web': ['www1', 'www2', 'www3'], 'dns': ['ns1', 'ns2'], }
構造主機列表有多種方式:
a.能夠經過命令行以全局的方式,使用 --hosts/-H 和 --roles/-R 參數。
from fabric.api import env, run env.hosts.extend(['host3', 'host4']) def mytask(): run('ls /var/www')
fab -H host1,host2 mytask 將在 host1 、 host2 、 host3 、 host4 上執行 mytask 。
b.能夠經過全局 env 。
from fabric.api import env, run env.hosts = ['host1', 'host2'] def mytask(): run('ls /var/www')
fab mytask 將在 host1 和 host2 上執行 mytask 。
c.
from fabric.api import env, run def set_hosts(): env.hosts = ['host1', 'host2'] def mytask(): run('ls /var/www')
fab set_hosts mytask 將先執行本地任務 set_hosts ,而後在兩個主機上執行 mytask 。
六、local 執行本地shell命令。 run 執行遠程命令;Fabric會自動處理錯誤,遇到錯誤時,默認和shell的行爲相同。能夠經過檢查命令運行的結果來改變錯誤的處理方式;