17

我正在使用 chef-solo 在本地测试我的食谱,但我希望能够只运行我正在测试的食谱。目前,似乎 chef-solo 将运行 solo.rb 中指定的食谱目录中的所有食谱。我已经在 json 属性文件中指定了运行列表,并在 solo.rb 中指定了 json 文件的位置,但这似乎没有帮助。它至少解析了所有其他食谱的属性,因为我有一个不适用于我的本地配置并且它使整个运行失败。

到目前为止,我发现的最佳解决方案是将测试所需的说明书移动到不同的目录并在 solo.rb 中指定。有更好的方法吗?

4

5 回答 5

28

更新:chef-solo 不再是 Chef-client 的“独立”工具。从文档中:

chef-solo 是一个命令,它以不需要 Chef 服务器的方式执行 chef-client 来聚合食谱。chef-solo 使用 chef-client 的 Chef 本地模式,不支持 chef-client / server 配置中存在的以下功能

此更改在Chef 版本 12.11中实现,该版本符合社区 RFC。这是在 2016 年 6 月 8 日发布的。下面描述的旧行为(尽管此时是 4 年前的)可--legacy-modechef-solo.

有关 Chef Solo 的最新信息,请阅读官方文档

我的原始答案如下:

厨师(独奏或客户)不会“运行”所有食谱。

它按以下顺序将说明书的所有 Ruby 文件加载到以下目录中:

  • 库/*.rb
  • 提供者/*.rb
  • 资源/*.rb
  • 属性/*.rb
  • 定义/*.rb

然后,它加载节点扩展运行列表中的所有配方。使用chef-solo时,这来自随 提供的 JSON 文件-j,或者可以在属性文件中完成 - 但是后者已被弃用且不推荐使用。

扩展的运行列表中包含的任何配方include_recipe也会被加载。Chef 通过将食谱评估为 Ruby 代码来加载食谱。当它遇到它识别为资源或定义的 ruby​​ 代码时,它会将资源添加到资源集合中,这是所有资源的数字排序索引散列。定义是特殊的,因为 Chef 将它们包含的资源而不是定义本身添加到资源集合中。包含食谱的资源通过include_recipe插入到位,然后 Chef 继续包含食谱。

一旦 Chef 处理了所有资源的所有配方,它就会遍历资源集合,按照添加到集合中的顺序对每个资源集合采取指定的操作。

我强烈建议阅读有关此过程的文档。适用于Chef Solo;仅跳过从服务器下载食谱的部分。

要确保仅测试您要测试的配方,请通过 JSON 文件将它们包含在节点的运行列表中。它看起来像这样:

{ "run_list": ["recipe[mything]", "recipe[anotherthing]"] }

运行列表只是一个数组,项目可以是recipe[cookbookname]role[somerole]。您可以在 Chef Solo 文档中阅读有关如何在 Chef Solo 中使用角色的更多信息。

如果您在 Chef 加载食谱组件(每个食谱中的 ruby​​ 文件)时进行了系统更改,那么“您做错了”(tm)并且应该重构这些事情以在从食谱调用的资源中完成.

于 2012-03-13T00:49:31.553 回答
14

另外值得注意的是,在测试时您可以轻松地覆盖运行列表

chef-solo --override-runlist "role["somerole"],recipe[mycookbook::recipe]"
于 2013-09-02T05:39:31.780 回答
5

可悲的是,我认为没有。Chef 以两遍模式运行:首先,它解析并构建您的说明书的模型(“编译”阶段),然后仅运行您在运行列表中指定的那些说明书。我相信它这样做是为了确保它在编译阶段捕获说明书之间的依赖关系。编译阶段必须保持一致,否则会出错。

要真正理解这一点,请查看ruby​​ 块资源。任何在你的配方中浮动的红宝石都将在编译时进行评估;您想在评估时运行的任何 ruby​​ 都必须放在 ruby​​ 块资源中。一旦你理解了这一点,两遍评估的性质就变得显而易见了。

我认为您唯一的选择是一次带一本食谱,就像您正在做的那样,或者修复您的属性。

于 2012-03-12T18:18:36.720 回答
2

您需要创建一个 JSON 文件。在那里,您可以指定究竟应该运行什么食谱:

{
  "run_list": [ "recipe[hello-chef]" ]
}

在这个分步教程中得到了很好的解释:http: //codeflex.co/creating-and-running-your-first-chef-cookbook/

于 2018-04-09T07:27:55.033 回答
1

chef-client --local-mode hello.rb
检查
https://learn.chef.io/learn-the-basics/ubuntu/configure-a-resource/
https://docs.chef.io/ctl_chef_client.html

于 2016-05-11T08:24:12.077 回答