Chef-Solo で Apache の VirtualHost を設定する

Vagrant 関連を一通りマスターしたところで、そろそろ Chef の調査を再開しようと思う。
以前、PHP をインストールするところまでやった。
http://d.hatena.ne.jp/okinaka/20110705/1309830735

今回は、Apache の VirtualHost の設定を行う。
Opscode の apache2 用 cookbook に仕組みが用意されているので、これを利用することにした。
VirtualHost の設定は、Webアプリケーション特有のものになるため、独自の cookbook を用意する。仮に myproj という名前で作成してみた。

  $ cd /var/chef-solo
  $ rake new_cookbook  COOKBOOK=myproj

apache2 の cookbook から VirtualHost のテンプレートファイルをコピーする。

  $ cd cookbooks
  $ cp apache2/templates/default/web_app.conf.erb \
       myproj/templates/default/myproj.conf.erb

複製した myproj.conf.erb を加工する。たとえば、RewriteRule などの設定が不要だったのでコメントアウトしておいた。テンプレートの中身はこんな感じ。
myproj/templates/default/myproj.conf.erb:

 <VirtualHost *:80>
   ServerName <%= @params[:server_name] %>
   ServerAlias <% @params[:server_aliases].each do |a| %><%= "#{a}" %> <% end %>
   DocumentRoot <%= @params[:docroot] %>
   :
   : (省略)
   :
 </VirualHost>

次にレシピを作成する。
myproj/recipes/default.rb:

  include_recipe "apache2"
  execute "a2dissite default"
  web_app "myproj" do
    docroot "/srv/myproj/public"
    template "myproj.conf.erb"
    server_name node[:fqdn]
    server_aliases [node[:hostname], "myproj"]
  end

include_recipe で apache2 のレシピを読み込んでいる。その後はデフォルトの VirtualHost を無効化し、web_app で VirtualHost の設定を行っている。環境ごとに変わる部分に関しては、attribute を参照するようにし、node.json で設定できるようにしておけばいいだろう。

最後に node.json を用意する。

{
 "run_list":"recipe[myproj]"
}

chef-solo を実行する。

 $ chef-solo -j node.json -c solo.rb

以上。