FATAL: NoMethodError: undefined method `unreachable_cookbook?' for nil:NilClass

FATAL: NoMethodError: undefined method `unreachable_cookbook?' for nil:NilClass

我是厨师新手,开始使用用户库编写简单的食谱。我的伯克斯档案:

name@name:~/chef-repo$ cat Berksfile
site :opscode

cookbook "users"

然后我运行:

berks install

和我的食谱:

name@name:~/chef-repo$ ls cookbooks/
users

最后是我的食谱:

name@name:~/chef-repo$ cat blah-users.rb 
include_recipe "users"

users_manage "blah-dev" do
  group_id 1001
  action [ :remove, :create ]
end

当我申请时出现错误:

name@name:~/chef-repo$ chef-apply blah-users.rb 
[2015-05-04T09:05:48-04:00] FATAL: Stacktrace dumped to /home/name/.chef/cache/chef-stacktrace.out
[2015-05-04T09:05:48-04:00] FATAL: NoMethodError: undefined method `unreachable_cookbook?' for nil:NilClass

我相当确定 include_recipe "users" 是问题所在(至少是第一个)。我还发现这一行 Stacktrace 转储到 /home/name/.chef/cache/chef-stacktrace.out 很有趣,因为该位置没有文件。

我试过使用和不使用 sudo。所以我认为这不是权限问题。

我是 运行 Chef 服务器 12.3 的本地安装,看起来运行良好...

谢谢


~/chef-repo$ sudo chef-apply blah-users.rb -l debug

[2015-05-04T13:17:50-04:00] DEBUG: Building node object for tbrown
[2015-05-04T13:17:50-04:00] DEBUG: Extracting run list from JSON attributes provided on command line
[2015-05-04T13:17:50-04:00] DEBUG: Applying attributes from json file
[2015-05-04T13:17:50-04:00] DEBUG: Platform is ubuntu version 14.04
[2015-05-04T13:17:50-04:00] INFO: Run List is []
[2015-05-04T13:17:50-04:00] INFO: Run List expands to []
[2015-05-04T13:17:50-04:00] DEBUG: Loading Recipe users via include_recipe
[2015-05-04T13:17:50-04:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
[2015-05-04T13:17:50-04:00] DEBUG: NoMethodError: undefined method `unreachable_cookbook?' for nil:NilClass
/opt/chefdk/embedded/apps/chef/lib/chef/run_context.rb:257:in `unreachable_cookbook?'
/opt/chefdk/embedded/apps/chef/lib/chef/run_context.rb:155:in `load_recipe'
/opt/chefdk/embedded/apps/chef/lib/chef/run_context.rb:142:in `block in include_recipe'
/opt/chefdk/embedded/apps/chef/lib/chef/run_context.rb:141:in `each'
/opt/chefdk/embedded/apps/chef/lib/chef/run_context.rb:141:in `include_recipe'
/opt/chefdk/embedded/apps/chef/lib/chef/dsl/include_recipe.rb:26:in `include_recipe'
blah-users.rb:1:in `run_chef_recipe'
/opt/chefdk/embedded/apps/chef/lib/chef/application/apply.rb:168:in `instance_eval'
/opt/chefdk/embedded/apps/chef/lib/chef/application/apply.rb:168:in `run_chef_recipe'
/opt/chefdk/embedded/apps/chef/lib/chef/application/apply.rb:180:in `run_application'
/opt/chefdk/embedded/apps/chef/lib/chef/application/apply.rb:193:in `run'
/opt/chefdk/embedded/apps/chef/bin/chef-apply:25:in `<top (required)>'
/usr/bin/chef-apply:51:in `load'
/usr/bin/chef-apply:51:in `<main>'
[2015-05-04T13:17:50-04:00] FATAL: NoMethodError: undefined method `unreachable_cookbook?' for nil:NilClass

评论后:

在某处使用 include_recipe 时,必须加载包含此食谱的食谱,有两种加载方法:

  1. 在运行列表中
  2. 在食谱的 metadata.rb 文件中使用 depends "cookbook", "version limitation",包括另一个 (Documentation)

这里使用 chef-apply 我们 运行 一个特定的食谱而不是 运行 列表所以 1 不适用并且 2 不适用,没有食谱可以加载,只有一个食谱。 Chef-apply 旨在使用内部厨师资源而不是 LWRP。

使用多个食谱的方法是创建一个食谱并在其 metadata.rb 文件中包含一个依赖指令。

之后,您可以 运行 使用 chef-solochef-zero 在命令行上使用 '-r 或 [=19] 指定 运行 列表=],这将允许加载所有需要的说明书,并使依赖说明书的 LWRP 可用。

关于 chef-client 模式(solo 和 zero 只是快捷方式)的更多扩展文档可用 here

我找到了这个问题的根源。 Chef apply 并没有通过load方法实例化运行 context对象中的cookbook_compiler变量(https://github.com/chef/chef/blob/master/lib/chef/run_context.rb#L157). Therefore the compiler object on this line https://github.com/chef/chef/blob/master/lib/chef/run_context.rb#L469为nil,看来编译器需要初始化。

已在此处开票: https://github.com/chef/chef/issues/3914