Fabricを試してみた

Fabric はシェルスクリプトを強化するPython製ライブラリ&ツールだ。

便利な点は

  • 複数ホストへの並列実行
  • Pythonでサポートされるデータ構造を利用出来る
  • シェルより変数などが扱い易い
  • with構文でコマンドの実行時コンテキストが明確になる
  • 環境の構築作業が関数(sudo(), local(), etc)で提供され明確になる

などがある。類似ツールに Cinnamon (Perl製) がある。

インストール

pipでインストールする。v1.7がインストールされた。pythonは2.5以上が必要。

利用例: Doxygenの解析結果を公開する

以前LuaソースコードをDoxygenで解析し結果を公開した。 その作業をFabricで自動で行う様にしてみた。 作業ディレクトリに以下の内容で [fabfile.py]{role=“file”} を作成した。

 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031
# coding:utf-8
from fabric.api import lcd, local
from fabric.contrib import project
from shutil import copyfile
import os.path


def setup_lua_doc(ver="5.1.5"):
    """
    特定ver.のLuaを取得してdoxygenで解析してhostingする
    """
    # 変数使って取得するLuaのバージョンを変更している
    lua_name = 'lua-' + ver
    local("wget http://www.lua.org/ftp/%s.tar.gz" % lua_name)
    local("tar zxvf %s.tar.gz" % lua_name)
    local("git clone https://gist.github.com/6752426.git")
    # 本当はコピー前にver 使ってPROJECT_NAME を書き換えるようにする
    # 良い方法がわからなかった
    # - Gist内容をJinjaテンプレート化する
    # - 正規表現で置き換える
    copyfile(
        os.path.join(".", "6752426", "Doxyfile"),
        os.path.join(".", lua_name, "Doxyfile"))
    with lcd(lua_name):
        local("doxygen")
        put_garage("html", "lua-graph")

def put_garage(path, proj_name):
    project.rsync_project(
        os.path.join("/", "var", "www", "garage", proj_name),
        path)

上記を準備し以下のコマンドを叩く。

1
$ fab setup_lua_doc:ver=5.1.5 -H garage.masu-mi.me

引数を渡すにはコマンド名の後ろに:を使用する。引数が複数ある場合は,で区切る。 今回の例では渡した値がデフォルト値なので書く必要はない。

これでLuaをダウンロードしてDoxygenを実行しrsyncで同期するまでが実行される。 put_garage()を使えばサーバーを利用しないスクリプトはgarage配下として直ぐに公開できる。

単純なので手軽に始められた良さそう。

呼び出している関数の説明

Fabric-1.7を読む。

local()

ローカルホストでシェルコマンドを実行する

lcd()
  • ローカルホストのカレントディレクトリを変更する
  • with構文に対応していてwith文から抜けるとカレントディレクトリは元に戻る
  • (リモートホストのカレントディレクトリを変更したい場合cd()関数がある)
project.rsync_project()

対象ディレクトリをrsync()で同期する

他にもリモートホストでシェルコマンド実行するsudo(), run()やファイルを送信するput()など色々ある。

comments powered by Disqus