1. 程式人生 > >系統批量運維管理器Fabric詳解

系統批量運維管理器Fabric詳解

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詳解