LoginSignup
3
3

More than 5 years have passed since last update.

Berksfileで拾ってきたCookbookがコケた時の対処(attributesが読み込まれない編)

Last updated at Posted at 2014-01-17

事象

Berksfileで拾ってきたレシピを使いたいが、include_recipeの最中にChefがコケる。

cookbook 'java',
  :git => 'git://github.com/opscode-cookbooks/java.git', :branch => 'master'
% berks install --path vendor/cookbooks
site-cookbooks/hoge/recipe/default.rb
...
include_recipe 'java'
...
% knife solo cook hoge
...
================================================================================
Recipe Compile Error in /tmp/vagrant-chef-1/chef-solo-1/cookbooks/hoge/recipes/default.rb
================================================================================


NoMethodError
-------------
undefined method `[]' for nil:NilClass


Cookbook Trace:
---------------
  /tmp/vagrant-chef-1/chef-solo-2/cookbooks/java/recipes/oracle.rb:31:in `from_file'
  /tmp/vagrant-chef-1/chef-solo-2/cookbooks/java/recipes/default.rb:21:in `from_file'
  /tmp/vagrant-chef-1/chef-solo-1/cookbooks/cdh-node/recipes/default.rb:10:in `from_file'


Relevant File Content:
----------------------
/tmp/vagrant-chef-1/chef-solo-2/cookbooks/java/recipes/oracle.rb:

 24:  #convert version number to a string if it isn't already
 25:  if jdk_version.instance_of? Fixnum
 26:    jdk_version = jdk_version.to_s
 27:  end
 28:
 29:  case jdk_version
 30:  when "6"
 31>>   tarball_url = node['java']['jdk']['6'][arch]['url']
 32:    tarball_checksum = node['java']['jdk']['6'][arch]['checksum']
 33:    bin_cmds = node['java']['jdk']['6']['bin_cmds']
 34:  when "7"
 35:    tarball_url = node['java']['jdk']['7'][arch]['url']
 36:    tarball_checksum = node['java']['jdk']['7'][arch]['checksum']
 37:    bin_cmds = node['java']['jdk']['7']['bin_cmds']
 38:  end
 39:
 40:  if tarball_url =~ /example.com/

原因

拾ってきたレシピのattributes/default.rbが読み込まれていない。

vendor/cookbooks/java/attributes.default.rb

# default jdk attributes
default['java']['install_flavor'] = "openjdk"
default['java']['jdk_version'] = '6'
default['java']['arch'] = kernel['machine'] =~ /x86_64/ ? "x86_64" : "i586" # <= ここの設定読み込みが必要
default['java']['openjdk_packages'] = []
...

解決策

拾ってきたレシピのattributesが読み込まれるようにする。
metadata.rbにdependsで利用するcookbookを指定することでattributesの値が読み込まれるようになる。

site-cookbooks/hoge/metadata.rb
...
depends          'java'
...
% knife solo cook hoge
…
[2014-01-17T14:45:07+09:00] INFO: Chef Run complete in 38.748854677 seconds
[2014-01-17T14:45:07+09:00] INFO: Running report handlers
[2014-01-17T14:45:07+09:00] INFO: Report handlers complete
[2014-01-17T14:44:28+09:00] INFO: Forking chef instance to converge...
[2014-01-17T14:44:28+09:00] DEBUG: Fork successful. Waiting for new chef pid: 14321
[2014-01-17T14:45:07+09:00] DEBUG: Forked instance successfully reaped (pid: 14321)
[2014-01-17T14:45:07+09:00] DEBUG: Exiting

余談

  • metadata.rbの中でdependsしなくてもレシピの使用は可能で、呼出す側のattributesに値を定義しておけばそれが適用される。
  • attributesの中だとkernel変数が存在しているがrecipe側で使おうとすると使えなかった。
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3