fabtoolsとcuisineを使うとFabricが分かりやすくなるかも

こんにちは、kotaです。前回のblogを書いた時期はまだ冬で外も寒かったのですが、次に何を書こうか考えているうちに、あっという間に春も中頃になっていました。
考えた時間と記事のクオリティは比例しないのですが、今回はfabtoolsとcuisineを使ってみた感想を書いてみたいと思います。

まずFabricって何?

簡単に説明すると、Python製のデプロイツールです。リモートのサーバに対してssh経由でpythonの関数を実行できます。
過去にもFabricについての記事があるので、今回は簡単な説明で終わりにします。

fabtoolsとかcuisineって何?

fabtoolsやcuisineはFabricをサポートするライブラリです。Fabricだけだと複雑になる処理もfabtoolsやcuisineを使うとわかりやすく書くことができます。
fabtoolsやcuisineを使った場合と使わない場合の例を紹介します。


mercurialのリポジトリをcloneする処理

  • fabricだけの場合
from fabric.api import cd, run
from fabric.contrib.files import exists

def hg_clone(dir, repo='aaa'):
    run('mkdir -p ' + dir)

    if not exists(dir + '/' + repo):
        with cd(dir):
            cmd = 'hg clone https://bitbucket.org/itkobo_z/' + repo
            run(cmd, warn_only=True)
  • fabtoolsとcuisineを使う場合
from fabric.api import cd
from fabtools import mercurial
from cuisine import dir_ensure, dir_exists

def hg_clone(dir, repo='aaa'):
    dir_ensure(dir)

    if not dir_exists(dir + '/' + repo):
        with cd(dir):
            url = 'https://bitbucket.org/itkobo_z/' + repo
            mercurial.clone(url)

あまりいい例ではないので間違い探しみたいですが、この例だとfabtoolsを使うことでhgコマンドを直接書く必要がなくなります。
cuisineを使うことでmkdirコマンドを書かなくても良くなっていますが、dir_ensureはディレクトリがなければ作成、あれば何もしないという判断まで含んでいます。このようにcuisineを使う一番のポイントは_ensureメソッドを使うことで冪等性があるコードが書き易くなる点だと思います。

また、fabtoolsには他にもfabtools.apache, fabtools.cron, fabtools.git, fabtools.mysqlなどのモジュールがあり、それらを使うことでコマンドを直接書かなくてもよくなります。
cuisineにもpackage_ensureやupstart_ensureなどの_ensureメソッドがあるのでそれらを使うとFabricがわかりやすくかけると思います。

使ってみた感想は?

fabtoolsやcuisineを使ってみた感想は、すでにFabricを使っていれば新しく覚えることもほとんどないので、すぐに使えていいなあという感じです。
とは言っても、既に動いているFabricをこれらのパッケージを使って書き直すほどではないかな、という気もするので、新しく書く処理があれば使いたいなと思います。

最後に、それぞれのドキュメントを紹介します。
fabtools: http://fabtools.readthedocs.io/
cuisine: https://github.com/sebastien/cuisine