2016-05-31 30 views
0

我开始在puppet(ruby)中开发,并且遇到以下问题。木偶。在ERB中迭代嵌套散列

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

$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”的内容来迭代散列?

感谢很多提前...

回答

7

您的模板看起来不错的大部分,但在这里几件事情。首先,你可能无法使用期限为您的变量名,但更重要的是,不要忘记逗号分隔键/值对:

$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, 
    } 
} 

在您的模板,你忘了等号,你也可能想通过使用-%>省略每次迭代换行字符:

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

 

编辑:OP,注意其他人都离开了意见。如果迭代顺序没关系,你不需要单独的阵列$database_profile_array引用键,而可以直接迭代哈希:

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

此外,-%> ERB木偶装饰标签记录here

+1

另请注意,您不一定需要单独的顶级密钥阵列。您可以遍历顶级哈希以获取这些密钥及其关联的哈希(值)。单独的数组仅适用于要指定节的显示顺序或要选择顶级键的外部引导子集的情况。 –

+1

RE回答:你可能想提及' - %>'是因为Puppet ERB修剪模式是'-'。 RE评论:他也可以使用来自'puppetlabs-stdlib'的'keys'自动生成该数组。 –

+0

@JohnBollinger非常好的一点,编辑我的答案,包括你的提示。谢谢! – drewyupdrew