FABRIC遠程批量管理(入門)

1、什麼是fabrichtml

    Fabric是一個Python(2.5-2.7)庫,用於簡化使用SSH的應用程序部署或系統管理任務的命令行工具。它提供的操做包括:執行本地或遠程shell命令,上傳/下載文件,以及其餘輔助功能,如提示用戶輸入、停止執行等操做。python

    簡單來講,它能夠經過SSH在多個host上批量執行任務。你能夠編寫任務腳本,而後經過Fabric在本地就能夠使用SSH在大量遠程服務器上自動運行。這些功能很是適合應用的自動化部署,或者執行系統管理任務。web

    

2、先看一個例子,用fabric實現批量修改機器密碼:shell

    編寫一個名字爲fabfile.py的腳本:vim

$ vim fabfile.pyapi

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
from fabric.api import run
from fabric.context_managers import env
#指定須要修改密碼的host
env.hosts = ['10.13.25.2','10.13.25.3','10.13.25.4']
env.user = 'root'
env.password = 'mypassword'
env.parallel = True
def chpasswd():
#用chpasswd修改用戶密碼
    run("echo 'root:newpassword'| chpasswd")

執行:$fab chpasswd安全

會看到如下返回結果,執行完成修改爲功:bash

$ fab sysbench服務器

[10.13.25.2] Executing task 'sysbench'ide

[10.13.25.3] Executing task 'sysbench'

[10.13.25.4] Executing task 'sysbench'

[10.13.25.4] run: echo 'root:newpassword'| chpasswd

[10.13.25.3] run: echo 'root:newpassword'| chpasswd

[10.13.25.2] run: echo 'root:newpassword'| chpasswd


Done.

會看到fabric的返回結果在前面都有相對應的IP地址,因爲env.parallel的值爲True,任務能夠在多臺機器上同時進行。

官方文檔中建議,爲了安全起見,最好是使用 SSH KEY 的方式來批量執行主機。

3、安裝

    fabric的安裝很簡單,能夠直接用鏡像源中自帶的包;

E.g.:

$sudo apt-get install fabric

官方的建議用pip或者easy_install(老版本,尤可用),須要先裝python-pip;你也能夠直接下載源碼;

E.g.:

$sudo apt-get install python-pip
$sudo pip install fabric


4、fabric的使用

一、Fabric有默認的執行文件名"fabfile.py",也能夠用-f參數指定;

E.g.:

fab -f chpasswd.py chpasswd

二、Fabric區分遠程目錄和本地目錄,fabric提供的對遠端和本地目錄的操做分別是cd和lcd,咱們能夠用普通用戶登錄上去pwd測試一下;

 E.g.:$ vim fabfile.py

#!/usr/bin/env python
from fabric.api import run
from fabric.context_managers import env
from fabric.context_managers import cd
env.hosts = ['10.13.25.2','10.13.25.3','10.13.25.4']
env.user = 'xjx'
env.password = 'xjx123'
env.parallel = True
def pwdtest():
    run('pwd')

$ fab pwdtest 

[10.13.25.2] Executing task 'pwdtest'

[10.13.25.3] Executing task 'pwdtest'

[10.13.25.4] Executing task 'pwdtest'

[10.13.25.4] run: pwd

[10.13.25.3] run: pwd

[10.13.25.2] run: pwd

[10.13.25.3] out: /home/xjx

[10.13.25.3] out:


[10.13.25.2] out: /home/xjx

[10.13.25.2] out:


[10.13.25.4] out: /home/xjx

[10.13.25.4] out:



Done.

能夠看到默認登錄上去的路徑是home目錄,很容易被忽略這一點;若是想要切換目錄引入'cd'命令,以下使用;

E.g切換到/usr/local目錄:

with cd('/usr/local')

三、Fabric裏的任務就是一個python函數,既然是python函數,那麼對函數的一些用法也適用於任務函數。好比傳遞參數、互相調用、返回值等等;

def hello(name="world"):
    print("Hello %s!" % name)

在執行任務的時候,能夠經過fab的命令行參數爲任務函數傳遞參數:
$ fab hello:name=XJX

Hello XJX

四、環境字典

Fabric中經過一個Python字典的子類來設置環境,它是一個全局的單例 fabric.state.env ,包含在 fabric.api中。Fabric的大部分行爲能夠經過修改 env 變量來控制。若是不但願全局生效,能夠經過 settings 上下文管理器來改變代碼塊的環境設置。env 能夠像字典那樣使用,同時也支持按屬性方式訪問。env 變量的完整列表見官方文檔 Full list of env vars ,推薦使用 settings 和 cd 這樣的上下文管理器來修改它們。

五、定義主機列表

主機字符串就是 user@host:port 形式的字符串, user 和/或 port 能夠省略。 hosts 變量定義主機列表,還能夠用roledefs 分組定義主機。

from fabric.api import env
env.roledefs = {
    'web': ['www1', 'www2', 'www3'],
    'dns': ['ns1', 'ns2'],
}

構造主機列表有多種方式:

a.能夠經過命令行以全局的方式,使用 --hosts/-H 和 --roles/-R 參數。

from fabric.api import env, run
env.hosts.extend(['host3', 'host4'])
def mytask():
    run('ls /var/www')

fab -H host1,host2 mytask 將在 host1 、 host2 、 host3 、 host4 上執行 mytask 。


b.能夠經過全局 env 。

from fabric.api import env, run
env.hosts = ['host1', 'host2']
def mytask():
    run('ls /var/www')

fab mytask 將在 host1 和 host2 上執行 mytask 。

c.

from fabric.api import env, run
def set_hosts():
    env.hosts = ['host1', 'host2']
    def mytask():
    run('ls /var/www')

fab set_hosts mytask 將先執行本地任務 set_hosts ,而後在兩個主機上執行 mytask 。

六、local 執行本地shell命令。 run 執行遠程命令;Fabric會自動處理錯誤,遇到錯誤時,默認和shell的行爲相同。能夠經過檢查命令運行的結果來改變錯誤的處理方式;

相關文章
相關標籤/搜索