Chef Recipe用嵌套数据创建模板

时间:2013-08-26 19:43:57

标签: amazon-web-services chef chef-recipe

我正在尝试为我的Amazon OpsWorks堆栈创建一个厨师食谱。我想将自定义JSON数据传递到堆栈中,并让配方创建一个.ini文件,以便与PHP的parse_ini_file()命令一起使用。

我的工作

目前,我可以创建一个平面.ini文件,其中包含以下内容:

JSON:

{
    "settings_ini": {
        "quantity": 1,
        "width": 10,
        "height": 20
    }
}

生成的settings.ini文件为:

quantity = 1
width = 10
height = 20

厨师食谱:

template "/my/path/here/settings.ini" do
    owner  "www_data"
    group  "www_data"
    mode   "0644"
    source "settings.ini.erb"
    variables({
        :settings_ini => node[:settings_ini]
    })
end

Chef模板" settings.ini.erb":

<% @settings_ini.each do |name, value| -%>
<%= name %> = <%= value %>
<% end -%>

我尝试做什么

我想将我的JSON数据更改为:

{
    "settings_ini": {
        "quantity": 1,
        "attributes": {
            "width": 10,
            "height": 20
        }
    }
}

我希望生成的settings.ini文件为:

quantity = 1

[attributes]
width = 10
height = 20

或者,它也可能是这样的:

quantity = 1
[attributes]width = 10
[attributes]height = 20

我需要帮助修改我的settings.ini.erb模板文件才能正确使用嵌套的JSON数据。

2 个答案:

答案 0 :(得分:1)

您可以使用递归函数。

坚持libraries/hash_to_ini.rb

def hash_to_ini(hash, lines = [])
  hash.each do |name, value|
    unless value.is_a? Hash
      lines << "#{name} = #{value}"
    else
      lines << "[#{name}]"
      lines = hash_to_ini(value, lines)
    end
  end
  return lines
end

然后在你的模板中:

<% hash_to_ini(@settings_ini).each do |line| -%>
<%= line %>
<% end -%>

答案 1 :(得分:0)

为什么不只是第二个each循环?

<% @settings_ini.each do |section, data| -%>
[<%= section %>]
<% data.each do |name, value| -%>
<%= name %> = <%= value %>
<% end -%>
<% end -%>

此代码未经测试..但我想它应该有用。

您还可以添加一些安全措施,例如: herehere