系統批量運維管理器Fabric詳解
1、fab常用的參數
fab作為Fabric程序的命令行入口,提供了豐富的參數調用,命令格式如下:
fab [options] <command>[:arg1,arg2=val2,host=foo,hosts=‘h1;h2‘,...]...
-l,顯示定義好的任務函數名;
-f,指定fab入口文件,默認入口文件名為fabfile.py;
-g,指定網關(中轉)設備,比如堡壘機環境,填寫堡壘機IP即可;
-H,指定目標主機,多臺主機用","號分隔;
-P,以異步並行方式運行多主機任務,默認為串行運行;
-R,指定role,以角色名區分不同業務組設備;
-t,設置設備連接超時時間(秒);
-T,設置遠程主機命令執行超時時間(秒);
-w,當命令執行失敗,發出告警,而而默認中止任務。
2、全局屬性設定
env對象的作用是定義fabfile的全局設定,支持多個屬性,包括目標主機、用戶、密碼、角色等,各屬性說明如下:
env.host,定義目標主機,可以用IP或主機名表示,以Python的列表形式定義,如env.hosts=[‘192.168.1.21‘,‘192.168.1.22‘]
env.exclude_hosts,排除指定主機,如env.exclude_hosts=[‘192.168.1.22‘]
env.user,定義用戶名,如env.user=‘root‘
env.port,定義目標主機端口,默認為22,如env.port=‘22‘
env.password,定義密碼,如env.password=‘111111‘
env.passwords,與password功能一樣,區別在於不同主機不同密碼的應用場景,需要註意的是,配置passwords時需要配置用戶、主機、端口等信息,如下:
env.passwords={
[email protected]:22‘:‘111111‘
[email protected]:22‘:‘111111‘
[email protected]:22‘:‘111111‘
}
env.gateway,定義網關(中轉、堡壘機)IP,如env.gateway=‘192.168.1.23‘
env.deploy_release_dir,自定義全局變量,格式:env.+"變量名稱",如env.deploy_release_dir、env.age、env.sex等
env.roledefs,定義角色分組,比如web組與db組主機區分開來,定義如下:
env.roledefs={
‘webservers‘:[‘192.168.1.21‘,‘192.168.1.22‘,‘192.168.1.23‘]
‘dbservers‘:[‘192.168.1.25‘,‘192.168.1.26‘]
}
引用時使用Python修飾符的形式進行,角色修飾符下面的任務函數為其作用域,下面來看一個示例:
@roles(‘webservers‘)def webtask():
run(‘/etc/init.d/nginx start‘)
@roles(‘dbservers‘)def dbtask():
run(‘/etc/init.d/mysql start‘)
@roles(‘webservers‘,‘dbservers‘)
run(‘uptime‘)def deploy():
execute(webtask)
execute(dbtask)
execute(pubclitask)
在命令行執行#fab deploy就可以實現不同角色執行不同的任務函數了。
3、常用API
Fabric提供了一組簡單但功能強大的fabric.api命令集,簡單地調用這些API就能完成大部應用場景需求,Fabric支持常用的方法及說明如下:
local,執行本地命令,如local(‘uname -s‘)
lcd,切換本地目錄,如lcd(‘/home‘)
cd,切換遠程目錄,如cd(‘/data/logs‘)
run,執行遠程命令,如run(‘free -m‘)
sudo,sudo方式執行遠程命令,如sudo(‘/etc/init.d/httpd start‘)
put,上傳本地文件到遠程主機,如put(‘/home/user.info‘,‘/data/user.info‘)
get,從遠程主機下載文件到本地,如get(‘/data/user.info‘,‘/home/root.info‘)
prompt,獲得用戶輸入信息,如prompt(‘please input user password:‘)
confirm,獲得提示信息確認,如confirm(‘Tests failed.Continue[Y/N]?‘)
reboot,重啟遠程主機,如reboot()
@task,函數修飾符,標識的函數為fab可調用的,非標記對fab不可見,純業務邏輯
@runs_once,函數修飾符,標識的函數只會執行一次,不受多臺主機影響
4、示例1:查看本地與遠程主機信息
#!/usr/bin/env python
#-*- codeing:utf-8 -*-
from fabric.api import *
display local or remote host information
env.user = ‘root‘
env.hosts=[‘192.168.110.129‘]
env.password=‘111111‘
@runs_once
def host_type():
run(‘uname -s‘)
def remote_task():
with cd(‘packets‘):
run(‘ls -l‘)
5、示例2:動態獲取遠程目錄列表
#!/usr/bin/env python
#-*- codeing:utf-8 -*-
#dynamic obtain remote host directory list
env.user = ‘root‘
env.hosts=[‘192.168.110.129‘]
env.password=‘111111‘
@runs_once
def input_raw():
return prompt(‘please input diectory name:‘,default=‘/root‘)
def worktask(dirname):
run(‘ls -l ‘ + dirname)
@task
def go():
getdirname = input_raw()
worktask(getdirname)
6、示例3:網關模式文件上傳與執行
#!/usr/bin/env python
#-*- codeing:utf-8 -*-
#gateway mode put file and execute
from fabric.api import *
from fabric.context_managers import *
from fabric.contrib.console import confirm
env.user=‘root‘
env.gateway=‘192.168.110.129‘
env.hosts=[‘192.168.110.130‘,‘192.168.110.131‘]
env.passwords={
[email protected]:22‘:‘111111‘,
[email protected]:22‘:‘111111‘,
[email protected]:22‘:‘111111‘,
}
lpackpath="/home/install/lnmp0.0.tar.gz"
rpackpath=‘/tmp/install‘
@task
def put_task():
run(‘mkdir -p /tmp/install‘)
with settings(warn_only=True):
result = put(lpackpath,rpackpath)
if result.failed and not confirm(‘put file failed,Continue[Y/N]?‘):
abort(‘Aborting file put task!‘)
@task
def run_task():
with cd(‘/tmp/install‘):
run(‘tar -zxvf lnmp0.9.tar.gz‘)
with cd(‘lnmp0.9/‘):
run(‘./centos.sh‘)
@task
def go():
put_task()
run_task()
本文出自 “gswcfl” 博客,請務必保留此出處http://guoshiwei.blog.51cto.com/2802413/1925009
系統批量運維管理器Fabric詳解