事象
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側で使おうとすると使えなかった。