2015-02-06 66 views
0

我编辑了示例代码来阐明我的问题。我认为现在的答案更有意义,因为我的第一个食谱确实在ruby_block中。厨师客户端运行期间何时设置默认节点属性?

在客户端运行期间何时可以使用默认节点属性?让我澄清一下。我的例子是简化的,但我想要做的比这更复杂,但概念是相似的。

我引导了一个节点,它运行一个空的运行列表。到现在为止还挺好。

现在我将我的hello_world食谱添加到我的节点的运行列表中。

knife node run_list add node_name "recipe[hello_world]" 

在我的程序hello_world食谱,我已经在属性/ default.rb定义以下默认属性

default.hello_world.location = '' 

我有一个食谱/ default.rb,这是否

include_recipe "hello_world::set_location" 
include_recipe "hello_world::show_location" 

recipes/set_location.rb does

ruby_block "Set location" do 
    block do 
    node.set.hello_world.location = "New York!" 
    end 
end 

和食谱/ show_location.rb做到这一点,使用日志资源

log "Hello #{node.hello_world.location}" 

我应该会看到这样的厨师客户端运行...

Hello New York! 

......或者干脆此,因为食谱尚未完全运行,因此其属性尚未与主厨服务器同步?

Hello 

我得到后者,就是没有“纽约!”就是“你好”。

如何让我的食谱记录“纽约你好!”客户端运行后?

也就是说,一般来说,如何在一个配方中设置节点属性,以便我可以在厨师客户端运行期间在同一本食谱的不同配方中使用它们?

回答

1

厨师的装载描述here和属性优先描述here

你应该已经为你更新日志资源之前的属性值进行编译,因为node.set是预期的结果不在ruby_block中。

我怀疑使用方法的语法是问题,更喜欢使用哈希访问。

即:

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

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

但因为它不是真正的代码(如果我理解正确的),我也不敢保证它的真实案例,没有一个真正的情况下,我可以”请确定你为什么得到这个结果。

您可以使用lazy evaluation在其他方面(属性ruby_block内更新)

+0

这是等价的:“纽约” node.set.hello_world.location =和node.set ['hello_world'] ['location'] =“纽约!”我会看懒惰的评价。 – 2015-02-06 14:21:00

+0

@ChrisF它是一个真正的“测试食谱”还是基于您的实际问题的一个例子? – Tensibai 2015-02-06 14:32:38

+0

这是一本我遇到问题的实际食谱。这个概念与 – 2015-02-06 18:23:28

相关问题