プロビジョニングツールでミドルウェアの設定ファイルを管理する時の方式について論じる。
例えば nginx の conf を管理するとして、管理しているアプリが10個ほどあり、それぞれのアプリで微妙に conf が異なるとする。
1. テンプレート方式
その場合、典型的には nginx.conf を erb などでテンプレート化すると思う。そして、異なるパラメータを erb 内の変数で埋めたり、場合によっては、パラメータで分岐させたりする。
まぁ、普通かな、という気はするがこの方式を取ると、ロジックが入り込んで複雑怪奇、完成系が erb を見ただけで予測できない、複雑なので単体テストが必要、などの問題が生じてくる。規模が大きくなるほど複雑さが増して来る。
2. ファイル分離方式
そこで、提案したい設定ファイルの管理方法がファイル分離方式である。アプリごとに conf が異なるならば、ファイルをわけてしまってテンプレートは使わない。
- nginx_app1.conf
- nginx_app2.conf
- nginx_app3.conf
- nginx_common_xxx1.conf
ようなイメージ。テンプレートを使わないので、複雑なロジックが入り込まずにすむ。DRY にしたい場合は、common ファイルを作って include する。
プロビジョニングツールで扱う場合
chef などのプロビジョニングツールで扱う場合、この方式に対してなんらかのサポートがあるわけではないが、ちょっとしたヘルパー関数を作って、conf へのパスをルールに則って生成できるようにしておくぐらいで十分賄える。