天天看點

FABRIC遠端批量管理(入門)

一、什麼是fabric

    Fabric是一個Python(2.5-2.7)庫,用于簡化使用SSH的應用程式部署或系統管理任務的指令行工具。它提供的操作包括:執行本地或遠端shell指令,上傳/下載下傳檔案,以及其他輔助功能,如提示使用者輸入、中止執行等操作。

    簡單來說,它可以通過SSH在多個host上批量執行任務。你可以編寫任務腳本,然後通過Fabric在本地就可以使用SSH在大量遠端伺服器上自動運作。這些功能非常适合應用的自動化部署,或者執行系統管理任務。

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

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

$ vim fabfile.py

<code>#!/usr/bin/env python</code>

<code># _*_ coding:utf-8 _*_</code>

<code>from</code> <code>fabric.api </code><code>import</code> <code>run</code>

<code>from</code> <code>fabric.context_managers </code><code>import</code> <code>env</code>

<code>#指定需要修改密碼的host</code>

<code>env.hosts </code><code>=</code> <code>[</code><code>'10.13.25.2'</code><code>,</code><code>'10.13.25.3'</code><code>,</code><code>'10.13.25.4'</code><code>]</code>

<code>env.user </code><code>=</code> <code>'root'</code>

<code>env.password </code><code>=</code> <code>'mypassword'</code>

<code>env.parallel </code><code>=</code> <code>True</code>

<code>def</code> <code>chpasswd():</code>

<code>#用chpasswd修改使用者密碼</code>

<code>    </code><code>run(</code><code>"echo 'root:newpassword'| chpasswd"</code><code>)</code>

執行:$fab chpasswd

會看到以下傳回結果,執行完成修改成功:

$ fab sysbench

[10.13.25.2] Executing task 'sysbench'

[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 的方式來批量執行主機。

三、安裝

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

E.g.:

<code>$</code><code>sudo</code> <code>apt-get </code><code>install</code> <code>fabric</code>

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

<code>$</code><code>sudo</code> <code>apt-get </code><code>install</code> <code>python-pip</code>

<code>$</code><code>sudo</code> <code>pip </code><code>install</code> <code>fabric</code>

四、fabric的使用

1、Fabric有預設的執行檔案名"fabfile.py",也可以用-f參數指定;

fab -f chpasswd.py chpasswd

2、Fabric區分遠端目錄和本地目錄,fabric提供的對遠端和本地目錄的操作分别是cd和lcd,我們可以用普通使用者登陸上去pwd測試一下;

 E.g.:$ vim fabfile.py

<code>from</code> <code>fabric.context_managers </code><code>import</code> <code>cd</code>

<code>env.user </code><code>=</code> <code>'xjx'</code>

<code>env.password </code><code>=</code> <code>'xjx123'</code>

<code>def</code> <code>pwdtest():</code>

<code>    </code><code>run(</code><code>'pwd'</code><code>)</code>

$ 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:

可以看到預設登陸上去的路徑是home目錄,很容易被忽略這一點;如果想要切換目錄引入'cd'指令,如下使用;

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

<code>with </code><code>cd</code><code>(</code><code>'/usr/local'</code><code>)</code>

3、Fabric裡的任務就是一個python函數,既然是python函數,那麼對函數的一些用法也适用于任務函數。比如傳遞參數、互相調用、傳回值等等;

<code>def hello(name=</code><code>"world"</code><code>):</code>

<code>    </code><code>print(</code><code>"Hello %s!"</code> <code>% name)</code>

在執行任務的時候,可以通過fab的指令行參數為任務函數傳遞參數:

$ fab hello:name=XJX

Hello XJX

4、環境字典

5、定義主機清單

主機字元串就是 user@host:port 形式的字元串, user 和/或 port 可以省略。 hosts 變量定義主機清單,還可以用roledefs 分組定義主機。

<code>from fabric.api </code><code>import</code> <code>env</code>

<code>env</code><code>.roledefs = {</code>

<code>    </code><code>'web'</code><code>: [</code><code>'www1'</code><code>, </code><code>'www2'</code><code>, </code><code>'www3'</code><code>],</code>

<code>    </code><code>'dns'</code><code>: [</code><code>'ns1'</code><code>, </code><code>'ns2'</code><code>],</code>

<code>}</code>

構造主機清單有多種方式:

a.可以通過指令行以全局的方式,使用 --hosts/-H 和 --roles/-R 參數。

<code>from fabric.api </code><code>import</code> <code>env</code><code>, run</code>

<code>env</code><code>.hosts.extend([</code><code>'host3'</code><code>, </code><code>'host4'</code><code>])</code>

<code>def mytask():</code>

<code>    </code><code>run(</code><code>'ls /var/www'</code><code>)</code>

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

b.可以通過全局 env 。

<code>env</code><code>.hosts = [</code><code>'host1'</code><code>, </code><code>'host2'</code><code>]</code>

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

c.

<code>def set_hosts():</code>

<code>    </code><code>env</code><code>.hosts = [</code><code>'host1'</code><code>, </code><code>'host2'</code><code>]</code>

<code>    </code><code>def mytask():</code>

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

6、local 執行本地shell指令。 run 執行遠端指令;Fabric會自動處理錯誤,遇到錯誤時,預設和shell的行為相同。可以通過檢查指令運作的結果來改變錯誤的處理方式;

      本文轉自Jx戰壕  51CTO部落格,原文連結:http://blog.51cto.com/xujpxm/1730780,如需轉載請自行聯系原作者

繼續閱讀