6

刚刚在我的 vagrant box 上运行了 nginx::source recipe,我的行为非常不寻常。

当我包含来自Vagrantfile的食谱时(如下所示),一切都像魅力一样,

chef.add_recipe("project::nginx")
chef.add_recipe("nginx::source")

project::nginx配方非常简单。使用它来覆盖 nginx 食谱的默认属性)

但是如果我在project::nginx的最后包含一个配方(提到过),一切都会崩溃:

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

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

4

1 回答 1

9

被我耍到了!厨师 11 功能。它的问题仅存在于 chef-solo 中:)

为了快速恢复,区别在于:

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

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

  • include_attribute - 明确包含所需的属性文件。
  • metadata.rb->dependency - 如果你的菜谱使用另一个菜谱中的菜谱,把那个菜谱放在 metadata.rb 的依赖部分,它的所有文件都将被加载。
  • chef.add_recipe() - 通过 Vagrantfile 加载食谱。(此处提及仅供参考)
  • Berkshelf - 你也可以使用这个食谱管理器来解决这个问题。这是关于这个确切问题的 Stackoverflow 线程一些文档

对于那些有兴趣进一步阅读的人,Chef 11 为非食谱文件引入了基于依赖的食谱加载。新的加载逻辑意味着,属于cookbook_path 中但不在扩展run_list 中的cookbook 文件或扩展run_list 中cookbook 的依赖项将不再被加载。REF:Opscode 中断更改文档,如果您需要我得到的错误的签名,这里是完全相同的,即使出于相同的原因。

于 2013-12-04T12:13:27.767 回答