ChefでSSL対応の仮想ホストを作成

資料がすくないなぁ。いろいろと試行錯誤してようやくちゃんと出来たので記録として残しときます。
DocumentRootを変更して、仮想ホスト名をつけています。

ssl_certificateクックブックを利用する

いろいろと調べていると、ssl_certificateってのがsupermarket.chef.ioにありました。berksでこれをインストール。

Berksfileに以下を追加。ssl_certificateはapache2クックブックが入っていることが前提となっているので、apache2もないなら入れときましょう。

site :opscode
(中略)
  cookbook 'apache2'
  cookbook 'ssl_certificate'

berksで追加。

$ berks

独自クックブックを作成

デフォルトのインストールだけならapache2のレシピとnode値でなんとかなるのですが、ちょいと手の混んだことをするためには別のcookbookを作成したほうが苦労が少ないようです。作成したcookbookをapache2のdependにしておけばOK。

$ knife cookbook create apache22 -o site-cookbook

依存関係を記述

上記で作成したapache22 cookbook中のmetadata.rbにapache2とssl_certificateをdependする対象として追記。文法がわからなくて試行錯誤した結果、複数行かけばいいらしい。

site-cookbook/apache22/metadata.rb

depends          "apache2"
depends          "ssl_certificate"

attributeを記述

サイトで共通になる値を記述。あ、DocumentRootもここにかけばよかったかな。
site-cookbook/apache22/attribute/default.rb

default['apache']['contact'] = "webmaster@example.com"

node.jsonFQDNを記述

それぞれのマシンで仮想ホスト名が違うので、それをnode以下のhostnamne.jsonへ記述。
node/hostname.json

"apache22": {
  "site_fqdn": "sslsite.example.com"
}

recipe作成

あとはrecipeを作成。
site-cookbook/apache22/recipes/default.rb

include_recipe 'apache2'
include_recipe 'apache2::mod_ssl'

my_key_path   = '/usr/local/apache2/conf/ssl/server.key'
my_cert_path  = '/usr/local/apache2/conf/ssl/server.crt'
my_chain_path = '/usr/local/apache2/conf/ssl/server.cer'

web_app "ssl_site" do
  cookbook "apache2"
  server_name node['apache22']['site_fqdn']
  allowoverride "all"
  docroot "/home/hoge/htdocs"
end

ssl_certificate "ssl_site" do
  key_path my_key_path
  cert_path my_cert_path
  chain_path my_chain_path
end

web_app "ssl_site" do
  cookbook "ssl_certificate"
  server_name node['apache22']['site_fqdn']
  docroot "/home/hoge/htdocs"
  ssl_key my_key_path
  ssl_cert my_cert_path
  ssl_chain my_chain_path
end

真ん中んのssl_certificateっていうリソースはいるのかなぁ。なんだか不要なきもするんだけど、exampleにそう書いてあったので入れときました。