Advertisement

Python Fabric模块介绍

阅读量:

前言

最近有一个需求,需要在服务器执行命令,结果需要返回本地,中间涉及到配置文件的传输,一开始我想到的是Paramiko,后来联想起之前一段时间在公众号看到Fabric,便研究了一下,最后发现Fabric能优雅的完成我的需求,脚本已经开发完成,稳定运行了一段时间,现在总结一下。


介绍

Fabric官方文档:http://docs.fabfile.org/en/2.4/index.html
Fabric最新的版本为2.4.0, 主要依赖模块为InvokeParamiko,安装方式pip install fabric


主要功能

  • 连接远程服务器并执行远程命令
复制代码
    >>> from fabric import Connection
    >>> c = Connection('web1')
    >>> result = c.run('uname -s')
    Linux
    >>> result.stdout.strip() == 'Linux'
    True
    >>> result.exited
    0
    >>> result.ok
    True
    >>> result.command
    'uname -s'
    >>> result.connection
    <Connection host=web1>
    >>> result.connection.host
    'web1'
  • sudo命令
复制代码
    >>> import getpass
    >>> from fabric import Connection, Config
    >>> sudo_pass = getpass.getpass("What's your sudo password?")
    What's your sudo password?
    >>> config = Config(overrides={'sudo': {'password': sudo_pass}})
    >>> c = Connection('db1', config=config)
    >>> c.sudo('whoami', hide='stderr')
    root
    <Result cmd="...whoami" exited=0>
    >>> c.sudo('useradd mydbuser')
    <Result cmd="...useradd mydbuser" exited=0>
    >>> c.run('id -u mydbuser')
    1001
    <Result cmd='id -u mydbuser' exited=0>
  • 文件传输
复制代码
    >>> from fabric import Connection
    >>> result = Connection('web1').put('myfiles.tgz', remote='/opt/mydata/')
    >>> print("Uploaded {0.local} to {0.remote}".format(result))
    Uploaded /local/myfiles.tgz to /opt/mydata/
  • 命令组合,实现批量自动化任务
复制代码
    from fabric import SerialGroup as Group
    
    def upload_and_unpack(c):
    if c.run('test -f /opt/mydata/myfile', warn=True).failed:
        c.put('myfiles.tgz', '/opt/mydata')
        c.run('tar -C /opt/mydata -xzvf /opt/mydata/myfiles.tgz')
    
    for connection in Group('web1', 'web2', 'web3'):
    upload_and_unpack(connection)

Fabric的特点

  1. Connection实例创建时并不会主动连接服务器,而内部实现会在执行命令前尝试连接,但需要时也可以自行选择连接,密码传输需要在Connection中传入connect_kwargs={'password': SSH_PASSWORD}
  2. 默认会打印远程终端的所有信息,若需要选择性打印信息,需要在run传入hide参数,这部分可以查看Invoke文档说明hide的可选参数如下:
复制代码
    hide = None  # default
    hide = True or 'both'  # 隐藏stdout和stderr流信息
    hide = 'out' or 'stdout' # 隐藏stdout流信息
    hide = 'err' or 'stderr' # 隐藏stderr流信息

以上。

全部评论 (0)

还没有任何评论哟~