Provisioning や Deployment にプログラミングスキルが必要になりつつあるようですが、皆様いかがお過ごしでしょうか。
Provisioning には、 Chef や Ansible が、 Deployment には capistrano や Fabric といったように使い分けられている方が多いようですが、私はずぼらなので Fabric を愛用しています。
Ansibleおしい!
環境によって違う変数とか、気持ちよく持たせたいじゃないですか。
Ansibleはいい感じにできます。
Provisioning とか Deployment のために、あらかじめ別の方法で agent 入れたりしたくないじゃないですか。
Ansibleはいい感じにできます。
全部Ansibleに書き換えようとか思った訳ですが、たとえばAmazonにInstanceをたてようとした場合に、なんかキモいことになるんです。
vagrant 使えばいい?ま、そうなんでしょうけど…
Fabricで押し通す
Fabricのつらいところはきっとこんな感じでしょう。
Immutable Infrastracture の時代なので、自動で Provisioning とか(そもそも勝手に何かされるの嫌いなんだけど)、気にしなくていいでしょう。新しいのを作り直せ!
fabfile が巨大になるのは、複数のfabfileをまたがって続けて実行するのが面倒くさいというか、共通の何かを再利用しにくいとかということがベースになってるんじゃないかと思った次第です。
依存関係も、まぁ、一連のものを忘れずに実行できればいいんだろうと思った次第です。
自由は奪ってやればいいと思った次第です。
どうやるのか?
Oozappa という Fabric をラップするものを作っています。
Fabricには task という実行単位があって、同じfabfileに定義されているtaskは1度に実行できます。
fabfileを Environment に分割する
Oozappa は Environment と呼ばれる fabfile を持ったディレクトリ単位を定義しています。Environment同士は干渉できませんが、どのEnvironmentからも利用できるcommonというディレクトリにテンプレートや変数、関数等を配置できます。テンプレートや変数は、必要な部分だけを各Environmentで上書きできます。
実行のまとまりを作る
Fabricで1つのfabfileに定義されている複数のタスクを指定した状態を、Jobとして登録します。
さらに、このJobを複数まとめたものをJobsetとして登録します。
複数の Environment をまたがった Jobset を作れば、構築からデプロイまで fabfile を分けていても一気に実行できます。
ブラウザから登録・実行
Environment、Job、Jobsetはブラウザから登録し、また、Jobsetの実行はブラウザから行います。
実行中のログは WebSocket を使ってブラウザに表示されます。
また、実行結果やログは保存され、Jobsetの画面では同一Jobsetの実行履歴が、トップページでは全Jobsetの実行履歴が表示されます。忘れっぽくてもいつ何を実行したかの記録が残ります。
オレとく〜