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獲得一個單個數據。

相關文章
相關標籤/搜索