一个例子
from fabric.api import *
from fabric.contrib.console import confirm
from fabric.utils import abort
env.hosts = [
'root@192.168.43.41:22',
'root@192.168.43.42:22',
'root@192.168.43.40:22'
]
env.passwords = {
'root@192.168.43.41:22':'ze123456',
'root@192.168.43.42:22':'ze123456',
'root@192.168.43.40:22':'ze123456'
}
def hostname():
run('hostname')
def ls(path='.'):
run('ls {0}'.format(path))
def tail(path='/etc/passwd', line=10):
run('tail -n {0} {1}'.format(line, path))
这里使用了三个fabric的封装:
run:用于执行远程命令的封装
sudo:以sudo权限执行远程命令
env:保存用户配置的字典
1、获取任务列表
fab -f fab_example.py --list
-f 用于指定文件名,如果不指定,默认使用fabfile.py文件
2、执行任务(函数)
fab -f fab_example.py hostname(函数名)
一次可以执行多个任务,按照顺序执行
fab -f fab_example.py hostname ls tail
3、fab命令参数
-l:查看task列表
-f:指定fab入口文件
-g:指定网管设备,如在堡垒机环境下,填写堡垒机IP
-H:在命令行指定目标服务器,用逗号分隔多个服务器
-P:以并行方式运行任务,默认为串行
-R:以角色区分不同的服务
-t:链接超时的时间,以秒为单位
-w:命令执行失败时的警告,默认是终止任务
-- Fabric参数,其他包含fabric脚本的中的参数的快捷操作,
如--user,--port,或者直接跟要执行的linux命令
4、env字典
env是一个全局的唯一字典,保存了Fabric所有的配置
常用env配置如下:
env.hosts:定义目标服务器列表
env.exclude_hosts:排除特定的服务器
env.user:SSH到远程服务器的用户名
env.port:远程服务器的端口号
env.key_filename:私钥文件的位置
env.password:SSH到远程服务器的密码
5、fabric提供的常用的指令
run():在远程服务器上执行linux命令,有一个重要的参数pty,如果执行一个需要常驻的服务区进程,需要设置pty=False
sudo():与run类似,使用管理员权限在远程服务器上执行shell指令,同样的有pty参数
loacl():用以执行本地命令,是对python的subprocess模块的封装,可以直接使用此模块,包含capture参数,默认为False表示subprocess输出信息进行显示,不想显示的话指定capture=Ture
def test():
result = local('make test',capture=True)
print(result)
print(result.failed)
print(result.succeeded)
#返回执行的命令
#如果执行失败那么result.failed为True
#如果执行成功那么result.succeeded为True
get():从远程服务器上获取文件
get(remote_path='/etc/passwd',local_path='/tmp/passwd')
put():将本地的文件上传到远程服务器,可以通过mode参数执行远程文件的权限配置
put(remote_path='/etc/passwd',local_path='/tmp/passwd')
reboot():重启远程服务器,可以通过wait参数设置等待几秒钟重启
reboot(wait=30)
prompt():用于在fabric执行任务的过程中与管理员进行交互,类似于python的input
key = prompt('please specify process nice level:',key='nice',validate=int)
confirm():获取提示信息确认
confirm('test failed,continue[Y/N]')
6、fabric的上下文管理器
cd():切换远程目录
def change(dir='/tmp'):
with cd(dir):
run('pwd')
run('pwd')
lcd():切换本地目录
path():配置远程服务器PATH环境变量,只对当前会话有效,不会影响远程服务器的其他操作,path的修改支持多种模式
append:默认行为,给指定的路径添加到PATH后面
prepend:将给定的路径添加到PATH的前面
replace:替换当前环境的PATH变量
def addpath():
with path('/tmp','prepend'):
run("echo $PATH")
run("echo $PATH")
prefix():要执行的代码块,都要先执行prefix的命令参数
def testprefix():
with cd('/tmp'):
with prefix("echo 123"):
run('echo 456')
run('echo 789')
等价于linux命令为:
cd /tmp && echo '123' && echo '456'
&& echo '123' && echo '789'
shell_env():设置shell脚本的环境变量
def setenv():
with shell_env(HTTP_PROXY='1.1.1.1'):
run('echo $HTTP_PROXY')
run('echo $HTTP_PROXY')
等价于shell中的export
export HTTP_PROXY='1.1.1.1'
settings():通用配置,用于临时覆盖env变量
def who():
with settings(user='dev'): #临时修改用户名为dev
run('who')
run('who')
remote_tunnel():通过SSH端口转发建立的链接
with remote_tunnel(3306):
run('mysql -uroot -p password')
hide()与show()用于隐藏和显示指定类型的输出信息
quiet():隐藏全部输出,仅在执行错误的时候发出告警信息
7、装饰器在任务前加@[装饰器名]
hosts:定制执行task服务器列表
roles:定义执行task的tole列表
parallel:并行执行task
serial:串行执行task
task:定义一个task
runs_once:该task只执行一次
@task装饰器
当使用之歌装饰器时,只有装饰器中包含的函数才会被加载为有效任务
from fabric.api import task
@task
def mytask():
run('a command')
@hosts装饰器
指定用户名和端口号
@hosts('root@192.168.10.10:22')
@task
def mytask():
run('a command')
@roles装饰器
用于对不同的服务器分组
env.roledefs={
'web':['root@192.168.10.10:22','root@192.168.10.20:22'] #role名称为web
'db':['root@192.168.10.30:22'] #role名称为db
}
@roles('web')
@task
def mytask():
run('a command')