鱒身(Masu_mi)のブログ

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

Fabricを試してみた

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

思いつく便利になる点は

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

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

インストール

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

やってみた: Doxygen の解析結果を公開する

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

# 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)

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

$ 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() などがある。