LoginSignup
2
0

More than 5 years have passed since last update.

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

Posted at

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
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0