【问题标题】:Chef Attribute file厨师属性文件
【发布时间】:2013-12-21 22:15:14
【问题描述】:

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

以下是我的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 文件中定义的基本属性运行 chef-client。我的node.json 看起来像:

{
  "base": {
    "nodename": "John"
  }
}

Chef-client 运行成功,并且相应地设置了属性。即

default['param']['name'] = "John"

比我在 node.json 中定义的 base 和 temp 属性运行 chef-client。 这是我的 node.json 文件:

{
  "base": {
    "nodename": "John"
  },
  "temp": {
    "tempname": "Mike"
  }
}

Chef-client 再次成功运行,并相应设置了属性。

default['param']['name'] = "Mike"

问题是,当我再次运行 chef-client 并仅从 node.json 文件中传递 base 属性(文件见下文)时,代码似乎没有进入 else 循环。它只是使用临时属性(Mike)的旧值运行“if”循环。

{
  "base": {
    "nodename": "John-2"
  }
}

关于我哪里出错的任何想法。

【问题讨论】:

    标签: ruby json chef-infra


    【解决方案1】:

    第二次运行 chef-client 时,它会将 node[:temp][:nodename] 属性保存到 Chef 服务器上的 node 对象。

    当您再次运行chef-client 时,它会在到达attributes/default.rb 文件之前从服务器加载回node 的属性,因此当达到条件时会设置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
    

    【讨论】: