半歩進むChef-Solo - definitionでtemplateを使うとき気をつけること
definitionでtemplateを使うとき気をつけること
Chefのdefinitionは、独自リソースを定義して、外部のCookbookからも呼び出せるため共通化に役立つ便利な仕組みです。
しかし、definition内でtemplateリソースを利用するとChef::Exceptions::FileNotFound
エラーが出る場合があります。
現象
templateリソースを利用したdefinitionを外部のCookbookから呼び出した場合にChef::Exceptions::FileNotFound
が発生します。
原因
templateリソースは、現在のCookbookのtemplatesディレクトリからテンプレートファイルを探すためです。
下記の場合だと呼び出し元となるmainクックブックのtemplatesディレクトリから探す挙動となってしまいます。
cookbooks/apache/definitions/apache_setup.rb
define :apache_setup do
template "/etc/httpd/conf/httpd.conf" do
source "httpd.conf.erb"
end
end
cookbooks/main/recipes/default.rb
# この場合、mainクックブックのtemplatesディレクトリからhttpd.conf.erbを探してしまう
apache_setup
対策
外部から呼ばれる可能性があるdefinition内のtemplateリソースには、検索対象となるCookbookを明示しておきます。
cookbooks/apache/definitions/apache_setup.rb
define :apache_setup do
template "/etc/httpd/conf/httpd.conf" do
cookbook "apache" # apache/templatesディレクトリから検索する
source "httpd.conf.erb"
end
end
以上です