【发布时间】:2017-06-14 02:36:08
【问题描述】:
我有两本食谱:
食谱 A 和食谱 B
CookbookB 定义了一个属性(例如“include_xyz”)。
如果 CookbookA 已运行,则应将其设置为“true”,否则应将其设置为“false”。
CookbookB/attributes/default.rb 中的“include_xyz”定义应该如何?
【问题讨论】:
标签: chef-infra chef-recipe chef-attributes
我有两本食谱:
食谱 A 和食谱 B
CookbookB 定义了一个属性(例如“include_xyz”)。
如果 CookbookA 已运行,则应将其设置为“true”,否则应将其设置为“false”。
CookbookB/attributes/default.rb 中的“include_xyz”定义应该如何?
【问题讨论】:
标签: chef-infra chef-recipe chef-attributes
啊,明白了!
default['include_xyz'] = "#{node.recipe?('CookbookA')}"
【讨论】:
由于属性文件都被解析(所有食谱中的所有属性都已同步到节点),在执行任何配方代码之前,以及在任何 include_recipe "CookbookA" 语句可能被解析之前,这是不可能的在属性代码中准确求解。
您可以完全消除该属性,直接在配方中制作条件代码:
if node.recipe?('CookbookA')
# do stuff conditionally
end
然而,最好颠倒这个逻辑,并围绕 CookbookA 编写一个包装器说明书,这样可以得到正确的行为。当断言正确的行为会更简单时,您正试图“监视” CookbookA。您可以添加一个属性来驱动您的食谱中的行为以及是否包含 CookbookA,并使该属性成为权威的事实来源。
【讨论】: