Chef infra 如何在Chef中定义收敛时的变量?

Chef infra 如何在Chef中定义收敛时的变量?,chef-infra,chef-recipe,Chef Infra,Chef Recipe,这看起来像是关于在converge时间修改Chef行为的另一个问题,但我在任何文档或其他问题中都没有找到解决这个问题的方法 我的一本食谱中有这样的定义: 食谱:A,食谱:A node['cookbookA']['resource'].each do |name, options| template "/etc/.../#{name}.conf" do .

这看起来像是关于在converge时间修改Chef行为的另一个问题,但我在任何文档或其他问题中都没有找到解决这个问题的方法

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

食谱:A,食谱:A

node['cookbookA']['resource'].each do |name, options|                                 
  template "/etc/.../#{name}.conf" do                                 
    ...
  end
end
此配方包含在不同烹饪书中的不同配方中,并且
节点['cookbookA']['resource']
的值在以下内容中定义:

食谱:B,食谱:B

include_recipe 'A::a'

node.default['cookbookA']['resource'] = ['foo']
在执行时,
节点['cookbookA']['resource']
为空

我试过的
  • 我试图找到一种方法将属性定义为
    lazy
    ,但在本例中无法使用,因为它不是资源的参数,而是变量本身
  • 看起来很令人兴奋,但在本例中,我认为它不能使用,因为该方法修改了一个已经存在的资源,但在本例中,属性为空,因此没有创建
    模板
    (没有进行循环迭代)
  • 在定义属性后放置
    include\u recipe
    语句,没有效果
  • 将优先级声明为
    节点。重写
    ,没有运气
问题:
如何解决这种情况,使配方
A::A
在收敛时在
B::B
中定义了值,而不在
属性中定义属性值,因为它依赖于配方

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

两件事:在配方中使用
节点。默认值
?如果要设置属性,请使用
node.set[…]
或在属性文件中设置默认值。第二:您正在将
节点['cookbookA']['resource']
设置为一个字符串,但随后您尝试将其作为数组进行迭代。这将抛出一个异常。刚刚尝试了
节点。设置
,不幸的是结果相同。我无法在属性中设置此属性,因为它依赖于配方(我只想在包含配方的情况下设置属性)2。是的,我的错,实际上我传递了一个数组,但是我用
foo
字符串来说明这个例子。我在问题中更改了它。现在移动
节点。将[…]
行设置在
include\u recipe
上方@KarenB谢谢,这很有效。如果您愿意,请在提示中添加一个答案,我会接受它,因为它解决了我的问题。@nKn如果您从多个配方中收取此值,请在Cookbook属性文件中将其初始化为空数组,然后使用
节点。默认值['key']