在厨师客户端运行期间何时设置默认节点属性?

时间:2015-02-06 01:57:48

标签: chef

我编辑了示例代码以澄清我的问题。我认为答案现在更有意义,因为我的第一个配方确实在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!"客户端运行后?

通常,如何在一个配方中设置节点属性,以便在厨师 - 客户端运行期间在同一个食谱的不同配方中使用它们?

1 个答案:

答案 0 :(得分:1)

描述了主厨的加载here,并描述了属性优先级here

在编译日志资源之前,您应该获得预期的结果,因为node.set不在ruby_block中。

我怀疑使用方法语法是问题,更喜欢使用散列访问。

即:

node.set['hello_world']['location'] = "New York!"

log "Hello #{node['hello_world']['location']}"

但由于它不是真正的代码(如果我理解正确的话),我不能发誓这是真实的案例,如果没有真实案例,我无法确定你为什么会这样做这个结果。

您可以在其他上下文中使用lazy evaluation(在ruby_block中更新的属性)