Chef属性文件

时间:2013-12-20 09:05:24

标签: ruby json chef

我正在尝试在厨师客户的运行时将属性传递给我的食谱。

以下是我的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

我想出错的地方。

1 个答案:

答案 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}}