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()
python fabric模块
最新推荐文章于 2024-04-26 01:45:18 发布