Chef infra 基于依赖关系的厨师烹饪书的执行

Chef infra 基于依赖关系的厨师烹饪书的执行,chef-infra,chef-recipe,chef-attributes,Chef Infra,Chef Recipe,Chef Attributes,我有两本食谱: 食谱A和食谱B CookbookB定义了一个属性(例如“include_xyz”) 如果CookbookA已运行,则应将其设置为“true”,否则应将其设置为“false”。 CookbookB/attributes/default.rb中的“include_xyz”定义应该是什么样子?啊,明白了 default['include_xyz']=“{node.recipe?('CookbookA')}” 由于在执行任何配方代码之前,以及在解析任何include_recipe

我有两本食谱: 食谱A和食谱B

CookbookB定义了一个属性(例如“include_xyz”)
如果CookbookA已运行,则应将其设置为“true”,否则应将其设置为“false”。

CookbookB/attributes/default.rb中的“include_xyz”定义应该是什么样子?

啊,明白了

default['include_xyz']=“{node.recipe?('CookbookA')}”

由于在执行任何配方代码之前,以及在解析任何
include_recipe“CookbookA”
语句之前,都会解析属性文件(已同步到节点的所有烹饪书中的所有属性),因此不可能在属性代码中准确求解

您可以完全消除该属性,只需直接在配方中生成条件代码:

if node.recipe?('CookbookA')
   # do stuff conditionally
end

不过,最好将这种逻辑颠倒过来,围绕CookbookA编写一本包装器烹饪书,以获得正确的行为。你试图在CookbookA上“窥探”,这时断言正确的行为会更简单。你可以添加一个属性来驱动你的食谱中的行为以及是否包含了CookbookA,并使该属性成为权威的真相来源。

这不会像你认为的那样起作用,我想不出一个好的理由想要这种属性。你最好不要尝试将这种布尔变量放入属性中,而直接在配方代码中使用该语句。谢谢拉蒙特的回复。我的用例略有不同。在这里,CookbookA提供了功能。CookbookB将根据天气状况更新道具文件(如果CookbookA运行,则为true;否则为false)。CookbookB有一个资源,它可以启动一个服务,检查这个道具值,并根据设置进行不同的操作。我理解您的意图。您不能可靠地做到这一点,您应该有一个更高级别的抽象,负责同时应用Cookbook a和Cookbook B。你思考解决这个问题的方式最终是行不通的。