簡(jiǎn)介
Fabirc是基于python實(shí)現(xiàn)的SSH命令行工具,非常適合應(yīng)用的自動(dòng)化部署,或者執(zhí)行系統(tǒng)管理任務(wù)。
簡(jiǎn)單的例子:
root@openstack:~# cat fabfile.py
def hello():
print 'hello world!'
root@openstack:~# fab hello
hello world!
Done.
這個(gè)fab簡(jiǎn)單地導(dǎo)入了fabfile,并執(zhí)行定義的hello函數(shù)。
fab作為Fabric程序的命令行入口,提供了豐富的參數(shù)調(diào)用,命令格式如下:
root@openstack:~# fab --help
Usage: fab [options] <command>[:arg1,arg2=val2,host=foo,hosts='h1;h2',...] ...
各參數(shù)含義如下:
參數(shù)項(xiàng) | 含義 |
---|---|
-l | 顯示可用任務(wù)函數(shù)名 |
-f | 指定fab入口文件,默認(rèn)為fabfile.py |
-g | 指定網(wǎng)關(guān)(中轉(zhuǎn)設(shè)備),比如堡壘機(jī)環(huán)境,填寫堡壘機(jī)IP即可 |
-H | 指定目標(biāo)主機(jī),多臺(tái)主機(jī)用“,”分隔 |
-P | 以異步并行方式運(yùn)行多臺(tái)主機(jī)任務(wù),默認(rèn)為串行運(yùn)行 |
-R | 指定角色(Role) |
-t | 設(shè)置設(shè)備連接超時(shí)時(shí)間 |
-T | 設(shè)置遠(yuǎn)程主機(jī)命令執(zhí)行超時(shí)時(shí)間 |
-w | 當(dāng)命令執(zhí)行失敗,發(fā)出告警,而非默認(rèn)終止任務(wù) |
實(shí)例分析
#自定義fabfile文件如下
#/root/fab.py
from fabric.api import *
#local_node和remote_node都可以為多個(gè)
local_node = ['127.0.0.1']
remote_node = ['10.116.97.30']
#定義local和remote角色
env.roledefs['local'] = local_node
env.roledefs['remote'] = remote_node
#定義用戶名
env.user = 'root'
#定義密碼
env.password = 'xxx'
#不同的角色執(zhí)行不同的命令
@roles('local')
def test_local():
#run命令在roles為local的主機(jī)上執(zhí)行命令"hostname"
run("hostname")
@roles('remote')
def test_remote():
run("hostname")
在python中調(diào)用:
root@openstack:~# python
Python 2.7.6 (default, Oct 26 2016, 20:30:19)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from fabric.api import execute
>>> import sys
>>> sys.path.append('/root')
>>> import fab
>>> execute(fab.test_local)
[127.0.0.1] Executing task 'test_local'
[127.0.0.1] run: hostname
[127.0.0.1] out: openstack
[127.0.0.1] out:
{'127.0.0.1': None}
>>> execute(fab.test_remote)
[10.116.97.30] Executing task 'test_remote'
[10.116.97.30] run: hostname
[10.116.97.30] out: openstack
[10.116.97.30] out:
{'10.116.97.30': None}
fabfile全局屬性設(shè)定
env對(duì)象的作用是定義fabfile的全局設(shè)定,各屬性說(shuō)明如下:
屬性 | 含義 |
---|---|
env.host | 定義目標(biāo)主機(jī),以python的列表表示,如env.host=['xx.xx.xx.xx','xx.xx.xx.xx'] |
env.exclude_hosts | 排除指定主機(jī),以python的列表表示 |
env.port | 定義目標(biāo)主機(jī)端口,默認(rèn)為22 |
env.user | 定義用戶名 |
env.password | 定義密碼 |
env.passwords | 與password功能一樣,區(qū)別在于不同主機(jī)配置不同密碼的應(yīng)用情景,配置此項(xiàng)的時(shí)候需要配置用戶、主機(jī)、端口等信息,如:env.passwords = {'root@xx.xx.xx.xx:22': '123', 'root@xx.xx.xx.xx':'234'} |
env.getway | 定義網(wǎng)關(guān) |
env.deploy_release_dir | 自定義全局變量 |
env.roledefs | 定義角色分組 |
常用的API
Fabric支持常用的方法及說(shuō)明如下:
方法 | 說(shuō)明 | |
---|---|---|
local | 執(zhí)行本地命令,如:local('hostname') | |
lcd | 切換本地目錄,lcd('/root') | |
cd | 切換遠(yuǎn)程目錄,cd('cd') | |
run | 執(zhí)行遠(yuǎn)程命令,如:run('hostname') | |
sudo | sudo執(zhí)行遠(yuǎn)程命令,如:sudo('echo “123456″ | passwd --stdin root') |
put | 上傳本地文件到遠(yuǎn)程主機(jī),如:put(src,des) | |
get | 從遠(yuǎn)程主機(jī)下載文件到本地,如:get(des,src) | |
prompt | 獲取用戶輸入信息,如:prompt(‘please enter a new password:’) | |
confirm | 獲取提示信息確認(rèn),如:confirm('failed.Continue[Y/n]?') | |
reboot | 重啟遠(yuǎn)程主機(jī),reboot() | |
@task | 函數(shù)修飾符,標(biāo)識(shí)的函數(shù)為fab可調(diào)用的 | |
@runs_once | 函數(shù)修飾符,表示的函數(shù)只會(huì)執(zhí)行一次 |