指定与Chef Solo一起运行的烹饪书

时间:2012-03-12 18:11:09

标签: chef

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

到目前为止,我发现的最佳解决方案是将我需要测试的食谱移到另一个目录并在solo.rb中指定。有没有更好的方法呢?

5 个答案:

答案 0 :(得分:28)

更新:chef-solo不再是chef-client的“独立”工具。来自documentation

  

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

此更改已在Chef version 12.11中实施,该community RFC符合the official documentation。这是在2016年6月8日发布的。旧的行为,如下所述(虽然从4年前开始),可以与--legacy-mode的{​​{1}}参数一起使用。

有关Chef Solo的最新和最新信息,请阅读https://docs.chef.io/chef_client.html#the-chef-client-run

我的原始答案如下:

Chef(solo OR client)不会“运行”所有的食谱。

按以下顺序加载以下目录中的所有cookbook的Ruby文件:

  • 库/ *。RB
  • 提供商/ *。RB
  • 资源/ *。RB
  • 属性/ *。RB
  • 定义/ *。RB

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

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

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

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

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

include_recipe

运行列表只是一个数组,项目可以是{ "run_list": ["recipe[mything]", "recipe[anotherthing]"] } recipe[cookbookname]。您可以在Chef Solo文档中阅读有关如何将Roles与Chef Solo一起使用的更多信息。

  • {{3}}

如果您在Chef加载cookbook组件(每个cookbook中的ruby文件)时进行了系统更改,那么“你正在做错了”(tm)并且应该重构那些要在一个叫做资源的事情中完成的事情。来自食谱。

答案 1 :(得分:14)

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

chef-solo --override-runlist "role["somerole"],recipe[mycookbook::recipe]"

答案 2 :(得分:5)

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

要真正理解这一点,请查看ruby block资源。任何在食谱中浮动的红宝石都将在编译时评估;您希望在评估时运行的任何ruby都必须放在ruby块资源中。一旦你了解了这一点,双程评估的性质就会变得明显。

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

答案 3 :(得分:2)

您需要创建一个JSON文件。在那里,您可以指定应该运行的菜谱:

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

在这个循序渐进的教程中已经很好地解释了:http://codeflex.co/creating-and-running-your-first-chef-cookbook/

答案 4 :(得分:1)