• 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)
    

    出错时用户确认

    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')
    
  • 相关阅读:
    [译]6.1. Data Structures Featured in This Chapter 本章涉及到的数据结构
    Linux中进程结构描述符
    How to uninstall GRUB
    [每日一点]msgsnd函数代码跟踪
    开始从代码入手学习内核
    剖析MagicAjax
    Castle实践6-TypedFactory Facility
    移植MSPetShop3到Castle MonoRail -Model与DAL层的移植(AR)
    热血江湖外挂之【热血江湖自补器 Version 0.1】
    对 "闭包closure" 的一些见解
  • 原文地址:https://www.cnblogs.com/superhin/p/13887526.html
Copyright © 2020-2023  润新知