Fabric和Fabric2在Pypi中就是同一个东西,fabric2只是Fabric的替代名称,为了便于使用备用名称进行安装。Fabric2和以前的Fabric1相比,彻底重写了,接口和功能都有很大改动,官网也不建议继续用Fabric1,建议升级到Fabric2。而最新版也早就支持Python 3.4+,和以前的Python2.7。但目前各个社区对fabric2的介绍不多,基本都是fabric1,fabric2与fabric1的接口基本是彻底不一样,所以目前使用的是fabric1api
pip install 'fabric <2.0'
因为 fabric 不仅是一个Python 模块,fabric 仍是一个命令行工具,能够经过fab -h进行命令的了解
talk is cheap, show the code工具
from fabric.api import * from fabric.colors import * #env.parallel = True 这个参数的含义是,对于批量机器的某个任务,全部机器并行执行; #默认是根据机器列表一个机器一个机器执行; env.warn_only=True #能够把退出换为警告,以提供更灵活的错误处理。 #若是设置为False,则一条命令运行失败会就会退出,再也不执行后面的命令。 #自动登陆机器的用户名和密码 #env:保存用户配置的字典 #(保存了相关的配置,好比登陆用户名 env.user,密码 env.password,端口 env.port 等, #若是没有指定用户名那么默认使用当前用户,端口使用22) env.user = "username" env.password = "password" #能够指定sudo的具体组用户,这样,若只有目标机器的cloud组权限, 指定后,sudo(cmd)方法将以cloud组的权限去执行 env.sudo_user = 'cloud' env.sudo_group = 'cloud' #设定run(cmd), sudo(cmd)的cmd命令行在目标机器上执行的超时时间 env.command_timeout = 20 #以组为单位管理机器 env.roledefs = { 'group1': [ 'p1.test.cn', 'p2.test.cn', 'p3.test.cn', 'p4.test.cn', 'p5.test.cn', 'p6.test.cn', 'p7.test.cn', 'p8.test.cn', 'p9.test.cn', 'p10.test.cn', ], 'log': [ 'log1.test.cn', 'log2.test.cn', ], } #以上定义了两个组,一个组叫group1,包含了十台机器,一个组叫log,包含了两台机器; @roles("group1") def check_ps(): run("ps -ef | grep demo") #直接在远程机器上以登陆帐户username的权限执行指令 put("./start.sh", "/home/wangzijie") #将本地当前目录下的start.sh文件复制到远程机器的/home/wangzijie目录下 put("./update.sh", "/etc/init.d/update.sh", use_sudo = True) #将本地当前目录下的start.sh文件复制到远程机器的/etc/init.d目录下; #因为这个目录只有root有写权限,所以use_sudo = True能够以sudo的权限来写,但须要有这台机器的sudo权限才能够 sudo("/etc/init.d/update.sh start") #以root的角色来执行update.sh脚本 sudo("/home/wangzijie/start.sh", user = "cloud") #以特定组cloud的角色来执行命令,须要在目标机器有cloud的权限; 或者在全局变量env.sudo_user, env.sudo_group中定义cloud,这样就不用在sudo方法中传递user这个参数了
fab check_ps
该命令须要在fable.py所在目录下执行,会对全部的group1机器运行check_ps方法中的全部命令,按照list的顺序执行,若须要全部机器并行执行,添加env.parallel = True便可fab 命令执行时,默认引用一个名为 fabfile.py 的文件,咱们也能够经过 -f 来进行指定。命令行
def hello(name, value): print "Hello Fabric! %s=%s" % (name,value)
执行时:code
fab hello:name=Year,value=2016
可使用env.host_string变量
示例接口
def deploy_all(): execute(deploy_task1) execute(deploy_task2) @roles("cluster1") def deploy_task1(): xxx ... @roles("cluster2"): def deploy_task2(): XXX ...