更新:chef-solo 不再是 Chef-client 之外的“独立”工具。来自documentation:
chef-solo 是一个执行 chef-client 的命令,它不需要 Chef 服务器来聚合食谱。 chef-solo 使用 chef-client 的 Chef 本地模式,不支持 chef-client / server 配置中存在的以下功能
此更改在Chef version 12.11 中实现,它满足community RFC。这是在 2016 年 6 月 8 日发布的。下面描述的旧行为(尽管此时是 4 年前的)可通过 --legacy-mode 参数提供给 chef-solo。
有关 Chef Solo 的最新信息,请阅读the official documentation
我原来的答案如下:
厨师(单独或客户)不会“运行”所有食谱。
它加载以下目录中的所有食谱的 Ruby 文件,顺序如下:
- 库/*.rb
- providers/*.rb
- 资源/*.rb
- 属性/*.rb
- 定义/*.rb
然后,它会加载节点扩展运行列表中的所有配方。对于chef-solo,这来自-j 提供的 JSON 文件,或者可以在属性文件中完成 - 但是后者已被弃用且不推荐使用。
通过include_recipe 包含在扩展运行列表中的任何配方也会被加载。 Chef 通过将食谱评估为 Ruby 代码来加载食谱。当它遇到它识别为资源或定义的 ruby 代码时,它会将资源添加到资源集合中,这是所有资源的数字排序索引散列。定义是特殊的,因为 Chef 将它们包含的资源而不是定义本身添加到资源集合中。通过include_recipe 包含的菜谱资源被插入到位,然后厨师继续包含菜谱。
一旦 Chef 处理了所有资源的所有配方,它就会遍历资源集合,按照添加到集合中的顺序对每个资源集合采取指定的操作。
我强烈建议您阅读有关此过程的文档。适用于Chef Solo;仅跳过从服务器下载食谱的部分。
为确保仅测试您要测试的配方,请通过 JSON 文件将它们包含在节点的运行列表中。它看起来像这样:
{ "run_list": ["recipe[mything]", "recipe[anotherthing]"] }
运行列表只是一个数组,项目可以是recipe[cookbookname] 或role[somerole]。您可以在 Chef Solo 文档中阅读有关如何在 Chef Solo 中使用角色的更多信息。
如果您在 Chef 加载食谱组件(每个食谱中的 ruby 文件)时进行了系统更改,那么“您做错了”(tm)并且应该重构这些事情以在名为的资源中完成来自食谱。