THINKING MEGANE

半歩進む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

以上です

このエントリーをはてなブックマークに追加