chef使用hash in属性填充模板中的xml值

时间:2017-05-17 15:59:38

标签: ruby hash chef

我在chef中的attributes / default.rb文件中有一个带有值的哈希数组,如下所示:

default['server']['database'] = [
    {
        'name' => 'srv1'
        'user' => 'usr1'
        'pass' => 'pwd1'
    },
    {
        'name' => 'srv2'
        'user' => 'user2'
        'pass' => 'pwd3'
    }
]

然后,我有一个带有以下嵌套循环的templates / default / server.xml.erb文件:

<% node['server']['database'].each do |hash| %>
    <% hash.each do |key, value| %>
        <%if key == "name" %>
            <Resource name="#{value}"
                <% else %>
                    #{key}="#{value}"
                <% end %>
            <% end %>
            />
        <% end %>

预期结果是:

<Resource name="srv1"
    user="usr1"
    pass="pwd1"
/>
<Resource name="srv2"
    user="usr2"
    pass="pwd2"
/>

我最终得到的是:

<Resource name="#{value}"
    #{key}="#{value}"
    #{key}="#{value}"
/>
<Resource name="#{value}"
    #{key}="#{value}"
    #{key}="#{value}"
/>

我在普通的红宝石中试过这个并得到它来打印预期的结果。不知道我在这里做错了什么,但请你,如果你能说清楚,我会很感激。

2 个答案:

答案 0 :(得分:1)

您需要使用erb <%= %>

<% node['server']['database'].each do |hash| %>
    <% hash.each do |key, value| %>
        <%if key == "name" %>
            <Resource name="<%= value %>"
                <% else %>
                    <%= "#{key}=\"#{value}\"" %>
                <% end %>
            <% end %>
            />
        <% end %>

答案 1 :(得分:0)

我会做这样的事情:

<% node['server']['database'].each do |hash| %>
  <Resource name="<%= hash['name'] %>"
            user="<%= hash['user'] %>"
            pass="<%= hash['pass'] %>" />
<% end %>

或者:

<% node['server']['database'].each do |hash| %>
  <Resource <%= hash.map { |k, v| "#{k}=#{v.inspect}" }.join(' ') %> />
<% end %>

请注意,在极端情况下,哈希中的键的顺序可能很难调试。与嵌套示例相比,我的示例不依赖于特定的键排序。