pip install fabric
from fabric.api import *
from fabric.context_managers import *
local #执行本地命令,如local('uname -s')
lcd #切换本地目录,如lcd('/home'),切换目录操作只对fab相关的命令有效!!针对其他python的语句,切换目录可以使用os.chdir()
cd #切换远程目录
run #执行远程命令
sudo #sudo方式执行远程命令,如sudo('/etc/init.d/httpd start')
put #上次本地文件导远程主机,如put('/home/user.info','/data/user.info',use_sudo=True) 可获取权限
get #从远程主机下载文件到本地,如:get('/data/user.info','/home/user.info')
prompt #获得用户输入信息,如:prompt('please input user password:')
confirm #获得提示信息确认,如:confirm('Test failed,Continue[Y/N]?')
reboot #重启远程主机,如:reboot()
env.hosts #定义目标主机,可以用IP或主机名表示,以python的列表形式定义。如env.hosts=['192.168.1.21','192.168.1.22']
env.exclude_hosts #排除指定主机,如env.exclude_hosts=['192.168.1.21']
env.user #定义用户名,如env.user='root'
env.port #定义端口,默认为22,如env.port='22'
env.password #定义密码,如env.password='123456'
env.passwords #定义多个密码,不同主机对应不同密码,如:env.passwords ={'[email protected]:22':'123456','[email protected]:22':'654321'}
env.roledefs #定义角色分组,比如web组合db组主机区分开来:env.roledefs ={'webserver':['192.168.1.21','192.168.1.22'],'dbserver':['192.168.1.25','192.168.1.26']}
fabric.colors #提供彩色输出, 导入后, green(text, bold=False),支持七个颜色(blue/green/cyan/magenta/red/white/yellow)
@parallel #装饰器,可以并行运行任务,pool_size=5为最大并行运行任务的个数
@serial 串行
@runs_once
@hosts('host1', 'host2') #使用host修饰来制定 host my_hosts = ('host1', 'host2') @hosts(my_hosts)
shell_env(JAVA_HOME='/opt/java')
ex:
from fabric.api import *
from fabric.context_managers import *
from fabric.colors import *
from fabric.contrib.console import confirm
env.hosts = '10.1.2.77'
env.user = 'root'
env.password = 'xxx123'
#env.hosts = ['[email protected]','[email protected]','[email protected]']
#env.passwords = {
# '[email protected]:22': "x123",
# '[email protected]:22': "x123",
#}
#env.parallel = True
env.roledefs = {
'apm': ['10.1.11.178'],
'docker': ['10.1.2.77']
}
def docker():
with lcd('D:/APM'):
local('dir')
with cd('/home'):
run('ls')
def tt():
put(r'D:\APM\Code\interface\show\fabfile.pyc', r'\home')
get(r'\home', r'D:\APM\Code\interface\show')
certain = prompt("your name?")
print certain
if confirm("are you robot?"):
print green("******hello, robot****")
def word(whole=1):
if whole == 3:
print "oaaaa"
else:
print "aoooo"
def hello(name, value):
print "Hello Fabric! %s=%s" % (name,value)
#fab hello:name=Year,value=2016
@roles('apm')
def ror():
run('ifconfig eth0')
@roles('docker')
def dd():
run('docker ps')
@parallel(pool_size=5)
def runs():
run('ip a')
pass
def task():
execute(build)
execute(deploy)
fab dd #执行命令
fab -l
fab -f script.py hello
fab -H [email protected],[email protected] hello
fab -R build deploy
fab -P hello
print green("Successful")
print yellow("Warning")
print red("Error")
默认情况下,Fabric在任务遇到错误时就会退出,如果我们希望捕获这个错误而不是退出任务的话,就要开启”warn_only”参数。在上面介绍”settings()”上下文管理器时,我们已经看到了临时开启”warn_only”的方法了,如果要全局开启,有两个办法:
- fab -w hello
- env.warn_only = True
upload = put('/tmp/myapp-0301.tar.gz', 'myapp.tar.gz')
if upload.failed:
sudo('rm myapp.tar.gz')
put('/tmp/myapp-0301.tar.gz', 'myapp.tar.gz', use_sudo=True)