Apache
chef
apache2

Chef で Apache2 の conf ファイルとしてどこの何を使うか指定できるようにする

More than 1 year has passed since last update.

https://github.com/svanzoest-cookbooks/apache2 の web_app リソースの使い方のお話です

バージョンは v3.1.0 で検証していますが、記事公開時の v3.2.2 でもたぶん同じです


web_app による conf ファイル生成

web_app リソースでは、 cookbook 内置いた erb ファイルを基に、conf ファイルを生成させることができます。


sample_base_cookbook/recipes/webapp_sample.rb

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 として使いたくなることが考えられます。


sample_another_cookbook/recipes/webapp_sample.rb

include_recipe 'sample_base_cookbook::webapp_sample'

# レシピは使いつつ、conf は sample_another_cookbook/templates/default/web_app.conf を使いたい...


このときは、レシピを下記のようにしておくことで cookbook を指定できます


sample_base_cookbook/recipes/webapp_sample.rb

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 のファイルを使うには、呼び出すときに下記のようにしておきます。


sample_another_cookbook/attributes/default.rb

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 のファイル名も指定できるようにしましょう。


sample_base_cookbook/recipes/webapp_sample.rb

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