如何在Chef的汇聚时间定义变量?

时间:2016-06-14 17:58:15

标签: chef chef-recipe

这可能看起来像是在收敛时修改Chef的行为的另一个问题,但我没有在任何文档或其他问题中找到解决此案例的方法。

我的一本食谱在食谱中有这个定义:

食谱:A,食谱:a

node['cookbookA']['resource'].each do |name, options|                                 
  template "/etc/.../#{name}.conf" do                                 
    ...
  end
end

此食谱包含在不同食谱中的不同食谱中,node['cookbookA']['resource']的值在内部定义:

食谱:B,食谱:b

include_recipe 'A::a'

node.default['cookbookA']['resource'] = ['foo']

在执行时,node['cookbookA']['resource']为空。

我尝试了什么

  • 我尝试找到一种方法将属性定义为lazy,但在这种情况下不能使用它,因为它不是资源的参数,而是变量本身。
  • This question似乎非常令人兴奋,但在这种情况下我认为它无法使用,因为此方法会修改已存在的资源,但在这种情况下,该属性为空,因此不会创建template (没有循环迭代)。
  • 在定义属性后放置include_recipe语句,没有效果。
  • 将优先级声明为node.override,没有运气。

问题

如何解决这种情况,因此配方A::a在收敛时具有B::b内定义的值,而不定义attributes内属性的值,因为它取决于配方?

1 个答案:

答案 0 :(得分:1)

在为使用该属性的配方调用include_recipe之前,需要通过任何方法设置新的属性值。