python之fabric2.0模块学习

FABRIC

什么是Fabric

fabric是一个python(2.7,3.4+)的库,用来经过SSH远程执行shell命令,并返回有用的python对象。
它创建在“invoke”和“paramiko”库之上,同时扩展了他们的API以提供更多的功能。html

Fabric使用方法

Connection

fabric的Connection方法继承自INVOKE,实现对单个主机的SSh链接,返回一个该主机的链接对象。经过该对象,对主机进行操做和管理。python

下面来看一下connectin方法参数。web

def __init__(
        self,
        host,
        user=None,
        port=None,
        config=None,
        gateway=None,
        forward_agent=None,
        connect_timeout=None,
        connect_kwargs=None,
        inline_ssh_env=None,
    ):
  • host:(str)主机名或IP地址,另外能够采用如下几种速写的格式:user@host, host:port, user@host:port
  • user:登陆用户名
  • port:(int)登陆端口
  • config:登陆配置文件
  • gateway:链接的网关或代理
  • forword_agent:(bool)是否开启agent_forwording
  • connect_timeout:(int)链接超时时间
  • connect_kwargs:(dict)提交链接参数的字典,多用于密码,密钥等。
  • inline_ssh_env:(bool)略

下面是一个简单例子:shell

from fabric import Connection


con = Connection(host='xxx.xxx.xxx.xxx', user='root', connect_kwargs={'password': '***'})
print(con)


>> <Connection host=xxx.xxx.xxx.xxx user=root>

 
 

Group

 
 

goup是一个部分抽象类,须要经过具象的子类(SerialGroup或者ThreadingGroup)来使用,不然python会抛出一个NotImplimentError。api

 
 

不少状况下,咱们须要同时操做多台服务器。最直接的办法天然是经过迭代的方法遍历整个主机列表。服务器

 
 
>>> from fabric import Connection
>>> for host in ('web1', 'web2', 'mac1'):
>>>     result = Connection(host).run('uname -s')
...     print("{}: {}".format(host, result.stdout.strip()))
...
web1: Linux
web2: Linux
mac1: Darwin
 
 

但有些时候会想将全部的主机链接合并在一个对象当中,这就须要SerialGroup这样的子类。ssh

 
 
>>> from fabric import SerialGroup as Group
>>> results = Group('web1', 'web2', 'mac1').run('uname -s')
>>> print(results)
<GroupResult: {
    <Connection 'web1'>: <CommandResult 'uname -s'>,
    <Connection 'web2'>: <CommandResult 'uname -s'>,
    <Connection 'mac1'>: <CommandResult 'uname -s'>,
}>
 
 

group方法和Connection在参数上有不少不一样。spa

 
 
class fabric.group.Group(*hosts, **kwargs)
 
 
  • *hosts:能够传入多个主机名或IP,同时和Connection的host参数同样,支持user@host, host:port,user@host:port速写方式。
  • **kwargs:fabric2.3版本新增的参数,使得group能够接收同Connection同样的参数。
 
 
group = SerialGroup(
    "host1", "host2", "host3", user="admin", forward_agent=True,
)
 
 

 

Run

执行shell命令,经过invoke.runners.Runner.run来实现。代理

run(command, **kwargs)

run的结果返回一个resul的实例。code

这个实例在group和Connection之间不尽相同。

>>> from fabric import SerialGroup as Group
>>> results = Group('web1', 'web2', 'mac1').run('uname -s')
>>> print(results)
<GroupResult: {
    <Connection 'web1'>: <CommandResult 'uname -s'>,
    <Connection 'web2'>: <CommandResult 'uname -s'>,
    <Connection 'mac1'>: <CommandResult 'uname -s'>,
}>
>>> for connection, result in results.items():
...     print("{0.host}: {1.stdout}".format(connection, result))
...
...
web1: Linux
web2: Linux
mac1: Darwin

group获得一个字典;connection获得一个单个数据。

相关文章
相关标签/搜索