ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2020-10-27 21:00:28  阅读:404  来源: 互联网

标签:__ fabric Python 命令 env fab local 服务端


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

标签:__,fabric,Python,命令,env,fab,local,服务端
来源: https://www.cnblogs.com/superhin/p/13887526.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有