致命:NoMethodError:未定义的方法`unreachable_cookbook?'为零:NilClass

时间:2015-05-04 13:12:02

标签: chef chef-recipe berkshelf berksfile

我是Chef的新手,并开始使用Users库编写一个简单的配方。我的Berksfile:

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

当我appply我收到错误时:

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"用户" 是问题(至少是第一个)。我还发现这行 Stacktrace转储到/home/name/.chef/cache/chef-stacktrace.out 很有意思,因为该位置没有文件。

我尝试过sudo和没有sudo。所以我不认为这是权限问题。

我正在运行本地安装的厨师服务器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

2 个答案:

答案 0 :(得分:1)

评论后:

在某处使用include_recipe时,必须加载托管此食谱的食谱,有两种方法可以加载它:

  1. 将其列入运行列表
  2. 在食谱的depends "cookbook", "version limitation"文件中使用metadata.rb,包括另一个(Documentation
  3. 在这里使用chef-apply我们运行一个特定的食谱,而不是一个运行列表,所以1不适用,2不适用,没有食谱加载,只有食谱。 Chef-apply旨在使用内部厨师资源而不是LWRP。

    使用倍数cookbook的方法是创建一个cookbook并在其metadata.rb文件中包含一个depend指令。

    之后,您可以使用chef-solochef-zero在命令行上使用&{39; -r-o指定运行列表来运行此食谱,这将允许加载所有需要的食谱,并使用依赖的食谱制作LWRP。

    有关厨师 - 客户模式(独奏和零只是快捷方式)的更多扩展文档可用here

答案 1 :(得分:0)

我找到了这个问题的根源。 Chef apply不会通过加载方法(https://github.com/chef/chef/blob/master/lib/chef/run_context.rb#L157)在运行上下文对象中实例化cookbook_compiler变量。因此,此行https://github.com/chef/chef/blob/master/lib/chef/run_context.rb#L469上的编译器对象为零。在我看来,编译器需要初始化。

在这里开了一张票: https://github.com/chef/chef/issues/3914