鱒身(Masu_mi)のブログ

知った事をメモする場所。

Fabric をPythonから呼び出す

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

fabfile.py を書いてfab コマンドとして使う場合が多いけれどfab コマンドだとトップレベルがタスクのため対象ホストの数だけ実行されてしまう。 例えばシステムの負荷検証を考えてみると、全体のタスクは1回だが一部に複数ホストに横断したタスクがある。 このような状況ではPythonで全体タスクを記述し複数ホストに横断する共通作業をFabric に任せるという使い方が便利です。

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

サンプルコード

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

#!/usr/bin/env python

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

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

$ ./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 の値が定まっている必要がある。