我编辑了示例代码以澄清我的问题。我认为答案现在更有意义,因为我的第一个配方确实在ruby_block中。
客户端运行期间何时可以使用默认节点属性?让我澄清一下。我的例子是简化的,但我想做的事情比这更复杂,但概念是相似的。
我引导了一个节点,该节点以空的运行列表运行。到目前为止一切都很好。
现在我将我的hello_world食谱添加到我节点的运行列表中。
knife node run_list add node_name "recipe[hello_world]"
在我的hello_world食谱中,我在attributes / default.rb中定义了以下默认属性
default.hello_world.location = ''
我有一个recipes / default.rb来完成这个
include_recipe "hello_world::set_location"
include_recipe "hello_world::show_location"
recipes / set_location.rb
ruby_block "Set location" do
block do
node.set.hello_world.location = "New York!"
end
end
和recipes / show_location.rb使用日志资源
执行此操作log "Hello #{node.hello_world.location}"
我是否希望在厨师 - 客户端运行中看到这一点......
Hello New York!
...或者仅仅是这个,因为食谱尚未完全运行,因此其属性尚未与Chef服务器同步?
Hello
我得到了后者,就是"你好"没有"纽约!"
如何让我的食谱记录下来" Hello New York!"客户端运行后?
通常,如何在一个配方中设置节点属性,以便在厨师 - 客户端运行期间在同一个食谱的不同配方中使用它们?
答案 0 :(得分:1)
在编译日志资源之前,您应该获得预期的结果,因为node.set不在ruby_block中。
我怀疑使用方法语法是问题,更喜欢使用散列访问。
即:
node.set['hello_world']['location'] = "New York!"
和
log "Hello #{node['hello_world']['location']}"
但由于它不是真正的代码(如果我理解正确的话),我不能发誓这是真实的案例,如果没有真实案例,我无法确定你为什么会这样做这个结果。
您可以在其他上下文中使用lazy evaluation(在ruby_block中更新的属性)