2年使って気づいた、fabricでサーバーセットアップすることの微妙さ

このへんの話。

結論はツイートの通り、冪等性の確保が大変すぎるというところ。んでサーバーセットアップ系のスクリプトは冪等に書けないといろいろ困るわけです。

rolesと冪等性

普通はサーバー構成はスケールアウト前提で設計するので、同一の役割をこなすサーバーが複数置かれることになります。こういうのの管理にはいわゆるrole機能が便利です。

env.roledefs = {
    'app': [
        '192.168.0.1',
        '192.168.0.2',
    ],
    'db': [
        '192.168.0.3',
        '192.168.0.4',
    ],
    # ...
}

特定のサーバーに対して実行するのは面倒なので、折角なら以下のように使えればいいんですが

@task
@roles('app')
def setup():
     # setup

このsetup関数が冪等じゃない場合、setupが安心して使えるのは初回セットアップの時のみです。

appを1台増やしたら、setup叩いとけばおわり とはいきません。新規のサーバー以外にどんな影響があるかわかったもんじゃないので。

仕方ないので以下のようにして回避したりしました。

@task
def setup_one():
    setup()

role消えちゃってます。代わりにプロンプトでホスト名を入れることで、setupを単体に対して実行できるようになってます。

こうなるとroleで纏めるより、単体狙いのタスク(上でいうsetup_one)のみを用意したほうがマシという本末転倒な状態になってしまいます。

適したツールを使おう

もちろんsetup関数が完璧に冪等にかけるならfabでも十分です。

でも手書きで冪等に書くのは骨が折れるし、そこに労力掛ける必要もきょうび無いと思うので、こういう作業の自動化にはchefなりansibleなりのCMツールを使ったほうが良いと思います。

だからと言ってfabricとかcapistranoがお払い箱かといえばそうでもなくて、デプロイとか再起動とかのサーバー操作にはやはりfab/capが鉄板です。chefでやろうとするとできなくはないけどもやっとします。

適材適所というやつです。