在Chef中设置和访问Custom Ohai属性

时间:2014-09-04 17:48:18

标签: chef ohai-gem

我按如下方式将属性列表设置为ohai。

Ohai.plugin(:mycustom) do
    provides "mycustom"

    collect_data do
        configs = ["sss=fdf", "tryet=werw"]
        Ohai::Log.info("Adding #{configs.length} ohai parameters..........................")
        configs.each { |param|
            if param.to_s.strip.length != 0
                key_value_pair = param.split("=").map(&:strip)
                mycustom Mash.new
                mycustom["mycustom_#{key_value_pair[0].downcase}"] = "#{key_value_pair[1]}"
            end
        }
    end
end

然后我将运行列表配置为按顺序运行ohai然后运行我的配方。如何在配方模板中访问上述设置属性?

<%= node['mycustom_sss'] %>

似乎不起作用。

如果在运行运行列表后执行ohai | grep mycustom,则不会返回任何内容。

1 个答案:

答案 0 :(得分:0)

您的插件提供mycustom,因此新的Mash及其值将位于node['mycustom']下。您的示例将导致node['mycustom']['mycustom_key']

我可以看到一个问题,你在循环的每次迭代中替换mycustom Mash,所以你只能得到一个最终值,但你仍然应该有一个。

由于您已经通过node['mycustom']获得前缀provide 'mycustom',因此您可以直接在其下方存放属性,而不是为密钥构建包含mycustom的字符串。

Ohai.plugin(:Mycustom) do
  provides 'mycustom'

  collect_data do

    mycustom Mash.new
    configs = [ "sss=fdf", "tryet=werw" ]
    Ohai::Log.info "Adding #{configs.length} ohai parameters......"

    extract_string_key_values(configs).each do |key,val| 
      Ohai::Log.debug "Got key [#{key}] val [#{val}]"
      next if key.length == 0
      mycustom[key.downcase] = val
    end

  end


  def extract_string_key_values array
    #  Split the array values on = and strip whitespace from all elements 
    array.map{|keyval| keyval.split('=').map(&:strip) }
  end

end

这是ohai 7,但它们并没有太大的不同。我将key / val解析拆分为一个单独的方法,因此循环更清晰。

要使命令行ohai获取插件,您需要为其提供一个目录,除非您在原始的ruby ohai gem路径中安装该插件。

ohai -d /your/ohai/dir | grep -A3 mycustom
[2014-09-04T21:00:32+01:00] INFO: Adding 2 ohai parameters...
  "mycustom": {
    "sss": "fdf",
    "tryet": "werw"
  }

然后它们会在您的节点结构中显示如下:

node[:mycustom][:sss] = fdf
node[:mycustom][:tryet] = "werw"

在厨师运行后,您应该能够看到mycustom

的节点knife属性
knife node show <nodename> -a mycustom