読者です 読者をやめる 読者になる 読者になる

作業ノート

様々なまとめ、雑感など

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キーワードを要求しない(本家ドキュメントより)

といったことが、今までエラーにならなかった理由なのかもしれない。

参考