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流信息

以上。

发布了43 篇原创文章 · 获赞 27 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/SCUTJcfeng/article/details/86351856