我正在尝试在厨师客户的运行时将属性传递给我的食谱。
以下是我的default.rb
属性文件:
if node['os'] == 'windows'
if node.attribute?('temp')
default['param']['name'] = node['temp']['tempname']
else node.attribute?('base')
default['param']['name'] = node['base']['nodename']
end
end
我首先使用node.json
文件中定义的base属性运行chef-client。我的node.json
看起来像:
{
"base": {
"nodename": "John"
}
}
Chef-client运行成功,并相应地设置了属性。即。
default['param']['name'] = "John"
比我运行了chef-client,同时在node.json中定义了base和temp属性。 这是我的node.json文件:
{
"base": {
"nodename": "John"
},
"temp": {
"tempname": "Mike"
}
}
Chef-client再次成功运行,并相应地设置了属性。
default['param']['name'] = "Mike"
问题是当我再次运行chef-client并且只从node.json文件传递base
属性时(参见下面的文件),代码似乎没有进入{{1} }循环。它只运行带有temp属性(Mike)旧值的`if'循环。
else
我想出错的地方。
答案 0 :(得分:3)
第二次运行chef-client
时,它将node[:temp][:nodename]
属性保存到Chef服务器上的node
对象。
当您再次运行chef-client
时,它会在到达node
文件之前从服务器加载attributes/default.rb
的属性,因此node[:temp][:nodename]
在到达时已设置default[:name_attribute] = 'temp'
条件。
我不确定你要实现的是什么,但最好明确告诉你要通过另一个属性使用哪个属性(并且可能假设它是默认属性),例如:
if node['os'] == 'windows'
if node['name_attribute'] == 'temp'
default['param']['name'] = node['temp']['tempname']
else
default['param']['name'] = node['base']['nodename']
end
end
然后,
{{1}}