“include_recipe”与Vagrantfile“chef.add_recipe”。有什么不同?

时间:2013-12-03 21:11:38

标签: nginx vagrant chef-recipe chef-solo

刚刚在我的流浪盒上运行nginx :: source recipe,我的行为很不寻常。

当我从 Vagrantfile (如下所示)中添加食谱时,一切都像魅力一样,

  

chef.add_recipe( “项目:: nginx的”)
  chef.add_recipe( “nginx的::源”)

project :: nginx 配方很简单。用它来覆盖nginx cookbook的默认属性)

但如果我在 project :: nginx (提及)的最后包含一个食谱,那么一切都会崩溃:

node.default['nginx']['server_names_hash_bucket_size'] = 128
include_recipe "nginx::source"

到目前为止,我不知道这两次调用之间的行为有什么不同。这里有人知道有什么区别吗?

1 个答案:

答案 0 :(得分:9)

Gotya!厨师11功能。它的问题仅存在于chef-solo中:)

要快速恢复,差异是:

  • chef.add_recipe() - 加载整个cookbook上下文(所有文件,例如食谱,定义,属性......)
  • include_recipe"" - 不加载不在扩展运行列表中的文件(属性,定义等)。

至少有4种方法可以解决问题(将文件放入运行列表中):

  • include_attribute - 明确包含所需的属性文件。
  • metadata.rb->依赖项 - 如果您的食谱使用其他食谱中的食谱,请将该食谱放入metadata.rb的依赖部分,并加载所有文件。
  • chef.add_recipe() - 通过Vagrantfile加载配方。 (这里仅提供参考)
  • Berkshelf - 你也可以使用这本食谱经理来解决这个问题。这是Stackoverflow thread about this exact problemsome Docs

对于那些有兴趣进一步阅读的人,Chef 11为非配方文件引入了基于依赖性的cookbook加载。新的加载逻辑意味着将不再加载属于cookbook的文件,这些文件存在于cookbook_path中但不在扩展的run_list中或扩展的run_list中的cookbook的依赖项中。 REF:Opscode breaking changes documentation,如果你需要我得到的错误的签名,here's完全相同,即使是相同的原因。