Update:chef-solo 不再是与 Chef-client “独立”的工具。来自文档 https://docs.chef.io/chef_solo.html:
Chef-solo 是一个命令,它以不需要 Chef 服务器的方式执行 Chef-client 来聚合说明书。 Chef-solo 使用 Chef-client 的 Chef 本地模式,并且不支持 Chef-client / 服务器配置中存在的以下功能
此更改实施于厨师版本12.11 https://discourse.chef.io/t/chef-client-12-11-18-released/8649,它满足社区 RFC https://github.com/chef/chef-rfc/blob/master/rfc031-replace-solo-with-local-mode.md。该版本于 2016 年 6 月 8 日发布。下面描述的旧行为(尽管是 4 年前的此时)可通过--legacy-mode
论证chef-solo
.
有关 Chef Solo 的最新信息,请阅读官方文档 https://docs.chef.io/chef_solo.html
我原来的答案如下:
厨师(独奏或客户端)不会“运行”所有食谱。
It loads以下目录中的所有说明书的 Ruby 文件,按以下顺序:
- 库/*.rb
- 提供商/*.rb
- 资源/*.rb
- 属性/*.rb
- 定义/*.rb
然后,它加载节点扩展运行列表中的所有配方。和chef-solo
,这来自提供的 JSON 文件-j
,或者可以在属性文件中完成 - 但后者已被弃用且不推荐。
扩展运行列表中包含的任何食谱include_recipe
也已加载。 Chef 通过将菜谱评估为 Ruby 代码来加载菜谱。当它遇到它识别为资源或定义的 ruby 代码时,它会将资源添加到资源集合中,资源集合是所有资源的按数字排序的索引哈希。定义很特殊,因为 Chef 将它们包含的资源(而不是定义本身)添加到资源集合中。包括食谱的资源通过include_recipe
插入到位,然后厨师继续添加食谱。
一旦 Chef 处理完所有资源的所有配方,它就会遍历资源集合,按照添加到集合中的顺序对每个资源采取指定的操作。
我强烈建议阅读有关此过程的文档。适用于《Chef Solo》;仅跳过从服务器下载食谱的部分。
- https://docs.chef.io/chef_client.html#the-chef-client-run https://docs.chef.io/chef_client.html#the-chef-client-run
为了确保仅测试您想要测试的配方,请通过 JSON 文件将它们包含在节点的运行列表中。它看起来像这样:
{ "run_list": ["recipe[mything]", "recipe[anotherthing]"] }
运行列表只是一个数组,项目可以是recipe[cookbookname]
or role[somerole]
。您可以在 Chef Solo 文档中阅读有关如何将角色与 Chef Solo 结合使用的更多信息。
- https://docs.chef.io/chef_solo.html https://docs.chef.io/chef_solo.html
如果您在 Chef 加载说明书组件(每个说明书中的 ruby 文件)时进行了系统更改,那么“您做错了”(tm)并且应该重构要在从菜谱调用的资源中完成的那些事情。