先上一段簡單的fabric代碼:html
from __future__ import with_statement
from fabric.api import *
env.user = 'zhangsan'
env.hosts = ['192.168.1.1']
env.password = '123456'
with settings(warn_only=True):
local('pwd')
with cd('/home/jianping.fan'):
run('ls')
當執行代碼後出現:No hosts found. Please specify (single) host string for connection:python
出現該錯誤的緣由是fabric的環境env有hosts和hosts_string倆種方法,前者是鏈接多臺機器,然後者是單臺連接,按官方文檔的說法,使用hosts指定主機,會遍歷該列表中主機ip,但實際執行中並無這樣作,猜想也許與fabric的版本有關係.我安裝的版本號是:1.14.0nginx
所以,將env.hosts = ['192.168.1.1] 改爲env.hosts_string = '192.168.1.1'便可解決單臺機器的鏈接問題. git
附Fabric env對象和經常使用APIgithub
env對象:web
env.hosts #定義目標主機,能夠用IP或主機名錶示,以python的列表形式定義。如env.hosts=['192.168.1.21','192.168.1.22'] 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的使用方法實例:api
env.roledefs = {'webserver':['192.168.1.21','192.168.1.22'],'dbserver':['192.168.1.25','192.168.1.26']} #引用分組時使用python裝飾器方式來進行,如: @roles('webserver') def webtask(): run('/usr/local/nginx/sbin/nginx') @roles('webserver','dbserver') def publictask(): run('uptime')
-----------------------------------------華麗的分割線----------------------------------------------------------------------------------------函數
經常使用API:spa
local #執行本地命令,如local('uname -s') lcd #切換本地目錄,如lcd('/home') cd #切換遠程目錄 run #執行遠程命令 sudo #sudo方式執行遠程命令,如sudo('/etc/init.d/httpd start') put #上次本地文件導遠程主機,如put('/home/user.info','/data/user.info') get #從遠程主機下載文件到本地,如:get('/data/user.info','/home/user.info') prompt #得到用戶輸入信息,如:prompt('please input user password:') confirm #得到提示信息確認,如:confirm('Test failed,Continue[Y/N]?') reboot #重啓遠程主機,如:reboot() @task #函數修飾符,標識的函數爲fab可調用的,非標記對fab不可見,純業務邏輯 @runs_once #函數修飾符,標識的函數只會執行一次,不受多臺主機影響
更多詳細用法請移步官網: https://fabric-chs.readthedocs.io/zh_CN/chs/tutorial.html code
git: https://github.com/fabric/fabric/