Python使用fabric在本地及服务端执行命令

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)

任务组合

在脚本中多个任务可以相关组合,执行时可以直接执行组合任务,示例如下

def task5(path):  # 组合任务
    task1()
    task2(path)

if __name__ == '__main__':
    fab.execute(task5, path='/usr/local')
上一篇:34步骤教你在阿里云空白服务器搭建一套fabric服务,一键ok版本


下一篇:怎么拉取fabric的相关镜像