Fabric をPythonから呼び出す

Fabricをライブラリとして使う例をメモしておく。 理由はネットで引くと大抵、ツールとして使われていて公式ドキュメントを読まないと誤解しがちなため。

fabfile.pyを書いてfabコマンドとして使う場合が多いけれどfabコマンドだとトップレベルがタスクのため対象ホストの数だけ実行されてしまう。

例えばシステムの負荷検証を考えてみると、全体のタスクは1回だが一部に複数ホストに横断したタスクがある。 このような状況ではPythonで全体タスクを記述し複数ホストに横断する共通作業をFabric に任せるという使い方が便利。

Fabric

システム管理・デプロイタスクの効率化の為のPythonライブラリおよびツール

サンプルコード

試しに以下のプログラムを書いてみる。

1
2
3
4
5
from fabric.api import run,local,execute
def test():
run("hostname")
local("ls")
execute(test, hosts=["host.name.jp"])

上記の実行結果は下の様になる。

1
2
3
4
5
6
7
8
$ ./test.py
[host.name.jp] Executing task 'test'
[host.name.jp] run: hostname
[host.name.jp] out: host.name.jp.
[host.name.jp] out:

[localhost] local: ls
test.py

タスクを表現した実行可能オブジェクトをfabric.tasks.executeに渡せば Fabricのタスクとして実行される。

Fabricのタスクはホスト毎に1回実行されるため、 上記の様に引き数で渡したりまたはwith settings():などコンテキストの指定を行なう事で env.hosts, env.roles, env.exculude_hosts の値を定めておく必要がある。

comments powered by Disqus