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

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

バージョンは [v3.1.0](https://github.com/sous-chefs/apache2/tree/138fbae287eb55b68d3f80457477270b7ccb365f) で検証していますが、記事公開時の v3.2.2 でもたぶん同じです

# web_app による conf ファイル生成

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

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

```rb:sample_another_cookbook/recipes/webapp_sample.rb
include_recipe 'sample_base_cookbook::webapp_sample'

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

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

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

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

```rb: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 メソッドが実行されないようにします。

```rb
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
```