您的位置:首页 > 编程语言 > Python开发

python fabric模块

2016-01-23 17:51 405 查看
fabfile
1.
fab 为fabric 命令行入口
-l  显示定义好的任务函数名
-f  指定fab入口文件,默认fabfile.py
-g	网关设备,如堡垒机
-H	指定目标主机多台用,分离
-R	指定role,以role区分不同业务组
-P	异步并行运行多主机任务,默认串行
-t	连接超时时间s
-T	远程执行命令超时时间
-w	执行失败是,发出警告

2.
evn全局设定,支持多个属性,包括目标主机,用户,密码,角色等

env.host=['192.168.1.10','192.168.1.11']
env.exclude_hosts=['192.168.1.10','192.168.1.11'] #排除主机
env.user='root'
env.port='22'
env.password='password_key'
env.passwords{
'root@192.168.1.11:22':'key',
'root@192.168.1.12:22':'key',
'root@192.168.1.13:22':'key',
}
env.gateway='192.168.1.1'
env.roledefs={
'web':['192.168.1.10','192.168.1.11','192.168.1.13']
'tomcat':['192.168.1.10','192.168.1.11']
'db':['192.168.1.10','192.168.1.11']
}
角色引用示例:
@roles('web')
def webtask():
run('/etc/init.d/nginx start')
@roles('db')
def dbtask():
run('/etc/init.d/mysql start')
@roles('db','web')
def publictask():
run('uptime')
def deploy():
execute(webtask)
execute(dbtask)
execute(publictask)

例子:
fab -H 192.168.1.86,192.168.1.156 -f fabfile.py host_type

fabfile.py如下
#!/usr/bin/env python
#--coding:utf8--
from fabric.api import run
def host_type():
run('hostname')
3.API
fabric 提供一组强大的fabric.api命令集
local('hostname') 执行本地命令
lcd('/home')		切换本地目录
cd('/')				远程执行
run('ifconfig')		远程执行
sudo('/etc/init.d/httpd restart')	sudo 远程执行
put(localpath,remotepath)	上传
get(remotepath,localpath)	下载
reboot()					重启
@task			该函数为fab可调用,非标记对fab不可见
@runs_once	函数修饰符只执行一次不受多台主机影响

例子:1
#!/usr/bin/env python
#--coding:utf8--
from fabric.api import *

env.user='root'
env.hosts=['192.168.1.86','192.168.1.116']
#env.password='pass_key'
def host_type():
run('hostname')
@runs_once
def local_task():
local('hostname')

def remote_task():
with cd('~'):
run('ls -l')

例子:2
#!/usr/bin/env python
#--coding:utf8--
from fabric.api import *

env.user='root'
env.hosts=['192.168.1.86','192.168.1.116']
#env.password='pass_key'

@runs_once
def input_raw():
return prompt("input directory name:",default="/home")
def worktask(dirname):
run("ls -l "+dirname)

@task
def go():
getdirname=input_raw()
worktask(getdirname)

执行
H1#fab -f fabfile.py go
[192.168.1.86] Executing task 'go'
input directory name: [/home] ~
[192.168.1.86] run: ls -l ~
例子3.
from  fabric.api import *
from  fabric.context_managers import *
from  fabric.contrib.console import confirm
env.user='root'
env.hosts=['192.168.1.116','192.168.1.86']

@task
@runs_once
def tar_task():
with lcd("/upload/"):
local("tar -czf web_html.tar.gz web_html")
@task
def put_task():
run("mkdir -p /var/www/html")
with cd("/upload/"):
with settings(warn_only=True):#出现异常继续上传,而非终止
result=put("/upload/web_html.tar.gz","/upload/web_html.tar.gz")
if  result.failed and not confirm("put file failed,Continue[Y/N]")
abort("aborting file put task!") # 出现异常是提示是否继续
@task
def check_task():
with settings(warn_only=True):
#本地local命令 需要配置 capture=Ture 才能捕获返回码
lmd5=local("md5sum /upload/web_html.tar.gz",capture=True).split(" ")[0]
'''
#md5sum v1.tar.gz
d01edeea9e56be808d33487ee86f91b6  v1.tar.gz
'''
rmd5=run("md5sum /upload/web_html.tar.gz").split(" ")[0]
if lmd5 == rmd5:
print("local_md5 == remote_md5!")
else:
print("error")

@task
def go():
tar_task()
put_task()
check_task()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: