https://github.com/svanzoest-cookbooks/apache2 の web_app リソースの使い方のお話です
バージョンは v3.1.0 で検証していますが、記事公開時の v3.2.2 でもたぶん同じです
web_app による conf ファイル生成
web_app リソースでは、 cookbook 内置いた erb ファイルを基に、conf ファイルを生成させることができます。
web_app "your_application_name" do
end
上記の場合、ファイル名の指定がないので sample_base_cookbook の web_app.conf が template として採用されます
cf: デフォルト値として web_app.conf
が指定されているのはここ https://github.com/svanzoest-cookbooks/apache2/blob/138fbae287eb55b68d3f80457477270b7ccb365f/definitions/web_app.rb#L20
cookbook を指定できるようにする
この webapp_sample.rb
を他の cookbook から include するパターンを考えると、違う erb ファイルを template として使いたくなることが考えられます。
include_recipe 'sample_base_cookbook::webapp_sample'
# レシピは使いつつ、conf は sample_another_cookbook/templates/default/web_app.conf を使いたい...
このときは、レシピを下記のようにしておくことで cookbook を指定できます
web_app "your_application_name" do
cookbook node[:sample_apache_conf_cookbook_name] # たとえば node[:apache][:conf_file][:cookbook_name] にすると綺麗
end
このとき、 sample_base_cookbook (呼ばれる側)の attributes を特にいじる必要はありません。
cookbook
メソッドの引数(この例では node[:sample_apache_conf_cookbook_name]
) が nil
の場合、 web_app リソースは template リソースに対して cookbook 名を渡しません。
cf: https://github.com/svanzoest-cookbooks/apache2/blob/138fbae287eb55b68d3f80457477270b7ccb365f/definitions/web_app.rb#L34
template リソースは、 cookbook が指定されない場合その cookbook のファイルが採用されます(この場合は sample_base_cookbook/template/default/web_app.conf
が採用される)
違う cookbook のファイルを使うには、呼び出すときに下記のようにしておきます。
default[:sample_apache_conf_cookbook_name] = cookbook_name # => "sample_another_cookbook"
# sample_another_cookbook という値が入れば、 sample_another_cookbook/template/default/web_app.conf が採用されるようになる
違うファイル名の erb ファイルを使えるようにする
もしかしたら、 sample_another_cookbook 内では web_app.conf に相当するファイルが複数必要だったりして、ファイル名を変えたくなるかもしれません。
template のファイル名も指定できるようにしましょう。
web_app "your_application_name" do
cookbook node[:sample_apache_conf_cookbook_name]
template node[:sample_apache_conf_file_name] if node[:apache][:conf_file][:name]
end
template には if をつけました。先ほどの cookbook 名の指定では if はありませんでした。これはデフォルトの挙動に違いがあるからです。
template メソッドに nil を渡してしまうと、 #{name}.conf
(name
は webapp メソッドの第一引数、この場合 your_application_name.conf
) を探そうとしてしまいます。
https://github.com/svanzoest-cookbooks/apache2/blob/138fbae287eb55b68d3f80457477270b7ccb365f/definitions/web_app.rb#L20
そこで、引数が nil になるときは template メソッドが実行されないようにします。
web_app "your_application_name" do
cookbook node[:sample_apache_conf_cookbook_name]
template node[:sample_apache_conf_file_name] if node[:sample_apache_conf_file_name]
# node[:apache][:conf_file][:name] が nil のとき、 web_app.conf が使われる
end
web_app "your_application_name" do
cookbook node[:sample_apache_conf_cookbook_name]
template node[:sample_apache_conf_file_name]
# node[:sample_apache_conf_file_name] が nil のとき、 your_application_name.conf が使われる
end