【问题标题】:Executing chef cookbook based on dependency基于依赖执行厨师食谱
【发布时间】: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


    【解决方案1】:

    啊,明白了!

    default['include_xyz'] = "#{node.recipe?('CookbookA')}"
    

    【讨论】:

    • 这不会像您认为的那样起作用,而且我想不出想要这种属性的充分理由。最好不要尝试将这种布尔变量放入属性中,而直接在配方代码中使用该语句。
    【解决方案2】:

    由于属性文件都被解析(所有食谱中的所有属性都已同步到节点),在执行任何配方代码之前,以及在任何 include_recipe "CookbookA" 语句可能被解析之前,这是不可能的在属性代码中准确求解。

    您可以完全消除该属性,直接在配方中制作条件代码:

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

    然而,最好颠倒这个逻辑,并围绕 CookbookA 编写一个包装器说明书,这样可以得到正确的行为。当断言正确的行为会更简单时,您正试图“监视” CookbookA。您可以添加一个属性来驱动您的食谱中的行为以及是否包含 CookbookA,并使该属性成为权威的事实来源。

    【讨论】:

    • 感谢拉蒙特的回复。我的用例略有不同。 CookbookA 在这里提供了 FeatureA。 CookbookB 将根据天气 FeatureA 是否启用来更新道具文件(如果 CookbookA 运行则 =true。否则 =false)。 CookbookB 有一个资源,它启动一个服务来检查这个 prop 值并根据设置做不同的事情。
    • 我明白你想做什么。你不能可靠地做到这一点,你应该有一个更高级别的抽象来负责将 Cookbook A 和 Cookbook B 一起应用。你想解决这个问题的方法最终是行不通的。
    猜你喜欢
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 2015-09-08
    相关资源
    最近更新 更多