【问题标题】:Puppet. Iterate over a nested hash in ERB木偶。遍历 ERB 中的嵌套哈希
【发布时间】:2016-05-31 14:11:41
【问题描述】:

我开始在 puppet (ruby) 中开发,我有以下问题。

我有想要在模板文件中迭代的当前哈希。

$database_profile_hash = 
{
  cpu   => {
    governor => ondemand
    energy_perf_bias => powersave
  }
  sysctl => {
    kernel.sched.min.granularity.ns => 10000000
    kernel.sched.wakeup.granularity.ns => 15000000
    kernel.msgmnb => 6
  }
  ...
}

我当前的模板如下:

<% @database_profile_array.each do |arrayValue| %>
[<%= arrayValue %>]
<% database_profile_hash[arrayValue].each do |key,value| %>
<%= key %> <%= value %>
<% end %>
<% end %>

为了迭代数组,我尝试使用一个数组来存储所有第一级名称,然后用它来迭代哈希:

$database_profile_array = [cpu,sysctl,...]

但我无法让它发挥作用,我正在寻找这样的出口:

[cpu]
governor=ondemand
energy_perf_bias=powersave

[sysctl]
vm.laptop_mode=5
vm.dirty_writeback_centisecs=1500
kernel.nmi_watchdog=0

我在模板中做错了什么?有没有办法通过变量“arrayValue”的内容来迭代hash?

提前非常感谢...

【问题讨论】:

    标签: arrays hash nested puppet erb


    【解决方案1】:

    您的模板大部分看起来都不错,但这里很少。首先,您可能无法在变量名中使用句点,但更重要的是,不要忘记用逗号分隔键/值对:

    $database_profile_array = [cpu,sysctl]
    $database_profile_hash =
    {
      cpu   => {
        governor => ondemand,
        energy_perf_bias => powersave,
      },
      sysctl => {
        kernel_sched_min_granularity_ns => 10000000,
        kernel_sched_wakeup_granularity_ns => 15000000,
        kernel_msgmnb => 6,
      }
    }
    

    在您的模板中,您忘记了等号,并且您还可能希望使用 -%&gt; 省略每次迭代的换行符:

    <% @database_profile_array.each do |arrayValue| -%>
    [<%= arrayValue %>]
    <% database_profile_hash[arrayValue].each do |key,value| -%>
    <%= key %>=<%= value %>
    <% end %>
    <% end -%>
    

     

    编辑:OP,请注意其他人留下的 cmets。如果迭代顺序无关紧要,则不需要单独的数组$database_profile_array 来引用键,而是可以直接迭代哈希:

    <% @database_profile_hash.each do |key, hash| -%>
    [<%= key %>]
    <% hash.each do |key,value| -%>
    <%= key %>=<%= value %>
    <% end %>
    <% end -%>
    

    此外,-%&gt; erb puppet trim 标记已记录在 here

    【讨论】:

    • 还请注意,您不一定需要单独的顶级键数组。您可以迭代顶级散列以获取这些键及其关联的散列(值)。仅当您要指定显示部分的确切顺序或要选择顶级键的外部指向子集时,单独的数组才有用。
    • RE 回答:你可能要提到-%&gt; 是因为Puppet ERB 修剪模式是-。 RE 评论:他还可以从puppetlabs-stdlib 自动生成带有keys 的数组。
    • @JohnBollinger 很好,编辑了我的答案以包含您的提示。谢谢!
    • @MattSchuchard,是的,他可以通过 stdlib 的 keys() 函数生成密钥数组。如果他想有时是有选择性的,有时是包罗万象的,这可能会很有用。但是,如果他希望 always 是包罗万象的,那么最好完全摆脱数组。
    • @JohnBollinger 是的,我知道,他可能也知道,但我提到如果他对生成数组的动态方法感兴趣,他会手动硬编码,所以他知道这种能力存在于未来
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多