我有一些基于搜索设置节点属性的代码。然后我想在模板中使用这些属性。看来模板是在我计算出值的代码之前编译的。所以需要运行 2 次 chef-client 才能达到我想要的状态
if !node['foo']
search(:node, "recipes:bla").each do |bla|
if bla['bla'] > node['foo']
node['foo'] = bla['bla']
end
end
end
template "/tm/foo" do
source "foo"
end
我已经尝试将此代码放在模板之前和之后的配方中,以及属性文件中。我认为没有search
动作,否则我可以尝试使用 .run_action() 。
有什么方法node['foo']
可以设置要设置的值,以便在模板中使用它?
编辑:澄清
cook_a/attributes/default.rb
default['cook_a']['val_1'] = node['someval']
cook_a/recipes/default.rb
template "/etc/cook_a.conf" do
source "cook_a.conf.erb"
end
cook_a/templates/default/cook_a.conf.erb
some_var = <% node['cook_a']['val_1'] %>
现在在另一本食谱中,我将覆盖该值
coob_b/recipes/default.rb
node.set['someval'] = "foo"
include "cook_a"
但是现在更改为时已晚,因此模板在第一次运行期间node['cook_a']['val_1']
写入原始值。node['someval']
在第二次运行期间,我得到了正确的值。
我不愿意设置node['cook_a']['val_1']
,因为该名称可能会更改,并且我正在尝试从 cook_a 的细节中抽象出来。