刚刚在我的流浪盒子上运行 nginx::source Recipe,并且我有非常不寻常的行为。
当我包含来自的食谱时流浪文件(如下),一切都像魅力一样,
Chef.add_recipe(“项目::nginx”)
Chef.add_recipe("nginx::source")
(项目::nginx食谱很简单。用它来覆盖 nginx 说明书的默认属性)
但如果我在最后添加一个食谱项目::nginx(上面提到过),一切都崩溃了:
node.default['nginx']['server_names_hash_bucket_size'] = 128
include_recipe "nginx::source"
直到现在我还不知道这两个调用之间的行为有什么区别。这里有人知道有什么区别吗?
被我耍到了!厨师 11 功能。问题仅存在于厨师独奏中:)
要快速制作简历,区别在于:
- Chef.add_recipe() - 加载整个食谱上下文(所有文件,例如食谱、定义、属性...)
- include_recipe "" - 不加载不在扩展运行列表中的文件(属性、定义等)。
至少有4种方法可以解决这个问题(将文件放入运行列表中):
- include_attribute - 显式包含所需的属性文件。
- metadata.rb->dependency - 如果您的食谱使用另一本食谱中的食谱,则将该食谱放入metadata.rb的依赖项部分,并且将加载其所有文件。
- Chef.add_recipe() - 通过 Vagrantfile 加载食谱。 (这里提到的仅供参考)
- Berkshelf - 您也可以使用此食谱管理器来解决问题。这是关于这个确切问题的 Stackoverflow 线程 https://stackoverflow.com/questions/20075061/chef-cookbook-fails-on-ohai-undefined-method-for-nilnilclass/20396483#20396483 and 一些文档 http://misheska.com/blog/2013/06/16/getting-started-writing-chef-cookbooks-the-berkshelf-way/
对于那些有兴趣进一步阅读的人,Chef 11 为非菜谱文件引入了基于依赖关系的说明书加载。新的加载逻辑意味着属于 Cookbook_path 中存在但不在扩展的 run_list 中的 Cookbook 的文件或扩展的 run_list 中的 Cookbook 的依赖项将不再被加载。参考:Opscode 重大变更文档 http://docs.opscode.com/breaking_changes_chef_11.html#non-recipe-file-evaluation-includes-dependencies,如果您需要我收到的错误的签名,here's https://tickets.opscode.com/browse/COOK-2342完全相同,甚至出于相同的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)