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

Chef infra 指定要与Chef Solo一起运行的烹饪书,chef-infra,Chef Infra,我正在使用chef solo在本地测试我的烹饪书,但我希望只能运行我正在测试的烹饪书。目前,chef solo似乎将运行solo.rb中指定的cookbooks目录中的所有cookbooks。我在json属性文件中指定了运行列表,并在solo.rb中指定了json文件的位置,但这似乎没有帮助。它至少会解析所有其他烹饪书的属性,因为我有一本不适用于我的本地配置的烹饪书,而且整个运行都失败了 到目前为止,我找到的最佳解决方案是将测试所需的食谱移动到另一个目录,并在solo.rb中指定。有更好的方法吗

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


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

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

要真正理解这一点,请查看资源。在您的食谱中浮动的任何ruby都将在编译时进行评估;要在计算时运行的任何ruby都必须放在ruby块资源中。一旦你摸索了一下,两遍评估的本质就变得显而易见了


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

更新:chef solo不再是chef client的“独立”工具。从:

chef solo是一个命令,它以一种不需要chef服务器的方式执行chef客户端,从而聚合cookbooks。chef solo使用chef客户端的chef本地模式,不支持chef客户端/服务器配置中的以下功能

此更改在中实施,满足了。该报告于2016年6月8日发布。下面描述的旧行为(尽管此时是4年前的行为)可以通过
--legacy mode
参数
chef solo
使用

有关厨师长Solo的最新信息,请阅读

我的原始答案如下:

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

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

  • 库/*.rb
  • 提供者/*.rb
  • 资源/*.rb
  • 属性/*.rb
  • 定义/*.rb
然后,它加载节点的扩展运行列表中的所有配方。对于
chef solo
,这来自
-j
提供的JSON文件,或者可以在属性文件中完成,但是后者不推荐使用,也不推荐使用

通过
include\u recipe
包含在扩展运行列表中的任何配方也会被加载。Chef通过将菜谱作为Ruby代码进行评估来加载菜谱。当它遇到它识别为资源或定义的ruby代码时,它会将资源添加到资源集合中,资源集合是所有资源的数字顺序索引哈希。定义是特殊的,因为Chef将它们包含的资源(而不是定义本身)添加到资源集合中。将通过
include_recipe
插入包含的食谱资源,然后厨师继续包含食谱

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

我强烈建议阅读有关此过程的文档。它适用于厨师独奏;仅跳过从服务器下载烹饪书的部分

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

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


如果您在Chef加载cookbook组件(每个cookbook中的ruby文件)时进行了系统更改,那么“您做错了”(tm),应该在从菜谱调用的资源中重构这些要执行的操作。

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

chef-solo --override-runlist "role["somerole"],recipe[mycookbook::recipe]"
chef客户端--本地模式hello.rb

检查


您需要创建一个JSON文件。在那里,您可以指定cookbook应该运行的具体内容:

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

在这个分步教程中解释得很好:

如果你的烹饪书是在
/etc.chef-solo.rb
中定义的,你也可以用这种方式速记它
$sudo chef solo-o nginx::start
这个命令给我以下错误:没有这样的烹饪书。菜谱名称和菜谱名称都可以。所有链接都已断开