我正在使用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文件:
然后,它加载节点的扩展运行列表中的所有配方.有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)