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

Jos*_*ark 17 chef-infra

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

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

jti*_*man 28

更新:chef-solo不再是Chef-client的"独立"工具.从文档:

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

此更改在Chef 12.11版中实现,该版本实现了社区RFC.这个发布于2016年6月8日,旧的行为,这是(此时虽然从4年前)如下所述,可与--legacy-mode参数chef-solo.

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

我原来的答案如下:

Chef(solo OR client)不会"运行"所有的烹饪书.

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

  • 库/*.RB
  • 供应商/*.RB
  • 资源/*.RB
  • 属性/*.RB
  • 定义/*.RB

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

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

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

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

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

{ "run_list": ["recipe[mything]", "recipe[anotherthing]"] }
Run Code Online (Sandbox Code Playgroud)

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

如果您在Chef加载cookbook组件(每个cookbook中的ruby文件)时进行了系统更改,那么"你正在做错了"(tm)并且应该重构那些要在从配方调用的资源中完成的事情.


KCD*_*KCD 14

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

chef-solo --override-runlist "role["somerole"],recipe[mycookbook::recipe]"
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 5

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

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

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