fabric是一款命令行工具,支持执行本地命令,执行远程命令,上传下载等。fabric想一个subprocess+paramiko的集合,又像一个更加轻量级的ansible,可以批量对服务进行操作。
官方文档地址,安装方法:
pip3 install fabric3
fabric.api中的常用操作
- 执行命令
- local('命令'): 本地执行命令
- run('命令'):在服务器上执行命令
- sudo('命令'): 在服务器上执行sudo命令
- abort('显示消息'): 终止任务
- confirm('用户确认Y/N'): 暂停并等待用户确认
- 上传下载
- put('本地文件', '服务器文件'): 上传文件
- get('服务器文件', '本地文件'): 下载文件
- 设置
- settings: 命令输出设置
- hide: 隐藏命令输出
- env: 服务器地址,用户密码信息设置
- 任务
- exectue(任务函数, 函数参数):执行一个任务
编写fab脚本
fabic需要新建一个文件,并定义函数使用,使用方式如下。
新建一个脚本,如task.py,内容如下
from fabric import api as fab # 导入fabric的api,给个别名为fab
def task1():
print('执行本地命令')
fab.local('ls') # 使用local可以执行本地命令
执行fab脚本
命令执行
脚本执行方式有两种,一种是命令行使用fab命令执行,如
fab -f task.py task1
-f
指定脚本文件, 后面跟要运行的函数
当函数有参数时,如
def task2(path):
fab.local(f'ls {path}')
执行fab命令传入参数的方式如下
fab -f task.py task1:path=/usr/local
脚本中执行
另外也可以直接在脚本中使用execute执行任务
from fabric import api as fab # 导入fabric的api,给个别名为fab
def task1():
print('执行本地命令')
fab.local('ls') # 使用local可以执行本地命令
def task2(path):
fab.local(f'ls {path}')
if __name__ == '__main__':
fab.execute(task1) # 执行任务1
fab.execute(task2, path='/usr/local') # 执行任务2
在服务端执行命令
from fabric import api as fab
fab.env.hosts = ['*.*.*.*]
fab.env.port = 22
fab.env.user = 'test'
fab.env.password = '123456'
def task3():
fab.run('ls /home/test') # 在远程执行命令,可也使用 fab.sudo(命令) 执行sudo命令
if __name__ == '__main__':
fab.execute(task3)
如果想忽略输出信息,并拿到结果可以使用settings
def task3():
with fab.settings(fab.hide('everything'), warn_only=True): # 关闭显示,仅显示警告
result = fab.run('ls /home/test') # 调用远程命令,并获取结果
print('命令输出信息', result)
print('命令是否失败', result.faild)
注:env.hosts中可以指定一批服务器,当服务器密码不同时,可以参考如下设置
fab.env.hosts = [
'root@192.168.10.201:22',
'root@192.168.10.202:22',
]
fab.env.passwords = {
'root@192.168.10.201:22':'123456201',
'root@192.168.10.202:22':'123456202',
}
上传文件
from fabric import api as fab
fab.env.hosts = ['*.*.*.*]
fab.env.port = 22
fab.env.user = 'test'
fab.env.password = '123456'
def task4(): # 上传
result = fab.put("/data/test.tar.gz", "/data/logs/test.tar.gz") # 第一个参数是本地文件路径,第二个参数服务器文件路径
if __name__ == '__main__':
fab.execute(task4)
出错时用户确认
from fabric import api as fab
def task5():
with fab.settings(warn_only=True):
result = local('jmeter -v', capture=True)
if result.failed and not fab.confirm("jmeter不存在,是否继续"): # 用户交互
abort('任务终止')
if __name__ == '__main__':
fab.execute(task5)
任务组合
在脚本中多个任务可以相关组合,执行时可以直接执行组合任务,示例如下
def task6(path): # 组合任务
task1()
task2(path)
if __name__ == '__main__':
fab.execute(task6, path='/usr/local')