Chefのweb_app

Chefを使ってapacheのバーチャルホストを作る時、configファイルについてはopscodeからberksでいれたapache2レシピに入ってるweb_appを利用するのが常道みたい。レシピはこんなのだけど、

  include_recipe "apache2"
  web_app "myapps" do
    serveradmin "root@example.com"
    allow_override "all"
    docroot "/home/public"
    server_name node[:fqdn]
    server_aliases [node[:hostname], "myapps"]
  end

でも、configurationファイルで設定すべきもののうち、上記のようにserveradminとか、docrootとか通り一辺のものしか設定できない。
どうすりゃいいんだと調べたけど、web_appのテンプレートファイルを自分の環境にコピーして、さらにレシピ中にtemplateで別のテンプレートを用意すればいいようです。

cookbookを作成

まあこれは通常通り。

$ knife cookbook create myapp -o site-cookbooks

cookbooks/apache2以下のテンプレートファイルをコピる

berksでcookbooks以下に入ったapache2のテンプレートファイルを先ほど作成したcookbooks以下へコピーする。

$ cp cookbooks/apache2/template/default/web_app.conf.erb site-cookbooks/myapp/templates/

このweb_app.conf.erbはいじらないようにする。

さらに自環境用のテンプレートファイルを準備する。

先ほどコピーしたテンプレートファイルをそのまま使う。

$ cp site-coookbooks/myapp/templates/web_app.conf.erb site-cookbooks/myapp/templates/myapp.conf.erb

でもって、コピーしたテンプレートファイルに入れたい設定を追加。

レシピを編集

当該仮想ホストの設定に以下を追加。

template 'myapp.conf.erb'

できればだね、テンプレートファイルをcookbooksとsite-cookbooksの両方を参照してほしいものだけど。

ところで

テンプレートファイルからは当然属性値が参照できる。で、今日設定していてすこし悩んだのが、テンプレートファイルに直接属性値を参照させるか、レシピ経由にするか。
例えば、DocumentRootの値をattribute/default.rbにこんな風に書いたとすると、

default['myapp']['docroot'] = "/home/app/htdocs"

テンプレートファイルにはこんな風にこの属性値を参照することができる。

DocumentRoot node['myapp']['docroot']

一方、DocumentRootはレシピ中にこう書かれているので

docroot "node['myapp']['docroot']"

レシピを経由して参照するとテンプレートファイルにはこう書く。

DocumentRoot <%= @params[:docroot] %>

どっちでも結果は同じですが、自分としては頻繁に編集するであろうレシピ経由にしといたほうがいいかと思い後者の方法を使いました。