我正在使用chef-solo在本地测试我的食谱,但我希望能够只运行我正在测试的食谱。目前,似乎chef-solo将在solo.rb中指定的cookbooks目录中运行所有cookbook。我已经在json属性文件中指定了运行列表,并在solo.rb中指定了json文件的位置,但这似乎没有帮助。它至少解析了所有其他cookbook的属性,因为我有一个不适用于我的本地配置,并且整个运行都失败了。
到目前为止,我发现的最佳解决方案是将我需要测试的食谱移到另一个目录并在solo.rb中指定。有没有更好的方法呢?
答案 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文件:
然后,它加载节点的扩展运行列表中的所有配方。对于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一起使用的更多信息。
如果您在Chef加载cookbook组件(每个cookbook中的ruby文件)时进行了系统更改,那么“你正在做错了”(tm)并且应该重构那些要在一个叫做资源的事情中完成的事情。来自食谱。
答案 1 :(得分:14)
另外值得注意的是,在测试时,您可以轻松覆盖运行列表
chef-solo --override-runlist "role["somerole"],recipe[mycookbook::recipe]"
答案 2 :(得分:5)
要真正理解这一点,请查看ruby block资源。任何在食谱中浮动的红宝石都将在编译时评估;您希望在评估时运行的任何ruby都必须放在ruby块资源中。一旦你了解了这一点,双程评估的性质就会变得明显。
我认为您唯一的选择是一次一张地引入您的食谱,就像您正在做的那样,或者修复您的属性。
答案 3 :(得分:2)
您需要创建一个JSON文件。在那里,您可以指定应该运行的菜谱:
{
"run_list": [ "recipe[hello-chef]" ]
}
在这个循序渐进的教程中已经很好地解释了:http://codeflex.co/creating-and-running-your-first-chef-cookbook/
答案 4 :(得分: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