【问题标题】:Re-using the output of one cookbook in another cookbook在另一本食谱中重复使用一本食谱的输出
【发布时间】:2021-08-07 05:26:42
【问题描述】:

假设我有 2 个说明书,A 和 B,它们都是在 AWS EC2 实例上执行的运行列表的一部分。第一个食谱 A 执行一些代码并生成一个值并将其存储在 node.run_state['pass'] 变量中。我需要食谱 B 中的这个值,所以我可以直接在食谱 B 中重用这个值,因为它是在同一个节点上执行的。我无法在厨房测试场景,因为由于某些依赖关系,食谱 A 在厨房失败。我需要直接在 EC2 中尝试,但在尝试之前需要了解。新手厨师,请帮助理解。

【问题讨论】:

    标签: chef-infra


    【解决方案1】:

    是的,您可以从不同的说明书中读取和写入节点属性和运行状态,并在它们之间共享一些信息。但您需要记住:

    1. 在运行列表中,食谱 A 必须在食谱 B 之前运行,或者食谱 B 的配方中必须包含 include_recipe 'A'
    2. Chef 运行有 2 个阶段:编译和执行。首先编译阶段在两个说明书中执行,然后是执行阶段。因此,您必须确保在 A 中实际写入 run_state 变量,然后才能在 B 中读取它。

    【讨论】:

    • 谢谢德拉科。关于您提到的第二点,我如何确保变量在第二本食谱中被读取之前实际上具有价值? include_recipe 'A' 已经处理了吗?有没有办法告诉我只有在 var 被“A”填充时才读取它
    • 这取决于你的食谱,没有通用的解决方案。
    • 您可以为您的node.run_state 属性匹配.nil? 并采取适当的措施。例如。 node.run_state['my_attribute'].nil?
    【解决方案2】:

    有时,通过查看配方“A”中的 node.run_state 属性的输出来调试这些情况会很有帮助,您尝试在使用和不使用惰性修饰符的情况下将其读入配方“B”。

    log 'foo' do
      message "node.run_state['foo']: #{node.run_state['foo']}"
      level :info
    end
    
    log 'lazy foo' do
      message lazy "{ node.run_state['foo']: #{node.run_state['foo']} }"
      level :info
    end
    

    【讨论】:

      猜你喜欢
      • 2017-07-11
      • 1970-01-01
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多