include_recipeで指定したcookbookがエラーになる
現象
今、Vagrant上でjenkinsを試している。今回jenkinsのインストールのためにopenjdkとjenkinsのcookbookを自作した。
openjdkでは、attributesで
# site-cookbooks/openjdk/attributes/default.rb
default['openjdk']['version'] = "1.7.0"
バージョンを定義し、レシピは
# site-cookbooks/openjdk/recipes/default.rb
version = node['openjdk']['version']
package "java-#{version}-openjdk"
package "java-#{version}-openjdk-devel"
このようにして、一旦単体でインストールできることを確認した。
この後、jenkinsのレシピで
# site-cookbooks/jenkins/recipes/default.rb
include_recipe 'openjdk'
...
と定義して実行したところ
...
==> default: NoMethodError
==> default: -------------
==> default: undefined method `[]' for nil:NilClass
...
というエラーになった。
対応
本家のドキュメントを読むとinclude_recipe
を使うときは、対象のcookbookを、metadata.rbのdepends
キーワードで指定しないといけない。
# site-cookbooks/jenkins/metadata.rb
name 'jenkins'
maintainer 'YOUR_COMPANY_NAME'
maintainer_email 'YOUR_EMAIL'
license 'All rights reserved'
description 'Installs/Configures jenkins'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version '0.1.0'
depends 'openjdk'
他のレシピでもinclude_recipe
を使っていたが、この現象は今回が初めて。
以下は推測だが、恐らく
- attributesの定義をしていない
- chef-soloでは、
depends
キーワードを要求しない(本家ドキュメントより)
といったことが、今までエラーにならなかった理由なのかもしれない。