Arrays puppet:对具有特定值数组的哈希进行迭代

Arrays puppet:对具有特定值数组的哈希进行迭代,arrays,hash,puppet,erb,Arrays,Hash,Puppet,Erb,我有一个散列,通过stdlib从yaml构建,其中包括散列中的数组。以下是yaml的一个示例: datacenter1: propertyA: - associatedItem cage1: serviceA: - server1 - server2 serviceB: - server10 backupCage: cage2 cage2: serviceA: - server3 - serve

我有一个散列,通过stdlib从yaml构建,其中包括散列中的数组。以下是yaml的一个示例:

datacenter1:
  propertyA:
    - associatedItem
  cage1:
    serviceA:
    - server1
    - server2
    serviceB:
    - server10
    backupCage:
      cage2
  cage2:
   serviceA:
    - server3
    - server4
    - server5
   serviceB:
    - server11
   backupCage:
     cage1
datacenter2:
  cage1:
    serviceA:
    - server20
    - server21
datacenter3:
  propertyZ:
    serviceD:
    - server200
    - server201
在本例中,我需要获取在erb的特定数据中心内提供服务的服务器列表。最终,这只需要以文本形式输出,并为conf文件添加一些任意数据。我正在尝试获取为给定数据中心提供服务a的所有服务器,在datacenter1的示例中:

thiscommand blahblah server1 
thiscommand blahblah server2
thiscommand blahblah server3
thiscommand blahblah server4
thiscommand blahblah server5
我将此映射广泛用于各种事情,但这是第一种情况,在这种情况下,我不能在puppet中设置一个变量,并在erb中作为单个数组对其进行迭代

编辑1:
这个数据来自puppet,但我正试图通过template()在erb中使用它

编辑2: 注意:此代码永远不会针对datacenter3运行,因为此代码特定于运行serviceA的数据中心

编辑3: 这是最终起作用的表单:


这个命令什么的

不清楚您是想在Puppet还是Ruby中实现这一点,下面介绍如何在两者中实现这一点

傀儡:

$hash['datacenter1'].each |$dc_key, $dc_nest_hash| {
  if $dc_nest_hash['serviceA'] {
    $dc_nest_hash['serviceA'].each |$serviceA_element| {
      notify { "thiscommand blahblah ${serviceA_element}": }
    }
  }
}

Ruby在通过Puppet
template
函数(注释是对该答案的说明;在实际形成模板之前删除):


#dc\u嵌套哈希中每个datacenter1嵌套散列的内容,并在每个哈希上迭代
#查找服务在每个dc_nest_散列中添加一个键,并在元素上迭代
这是布拉布拉赫的命令
>


此数据来自puppet,但我正试图在erb中使用它。以你所写的作为起点,我几乎可以处理我上面发布的编辑(大部分是“dos”)。仍然不满意这种语法:
-:6:语法错误,意外',',预期输入结束@散列['datacenter1']。每个| cage_键、cage_值| do
错误胡萝卜位于分隔cage_键和cage_值的空格处,该空格位于第7行的parser template.erb。第7行是:
详细信息:nil:NilClass的undefined method
each
一旦我开始,我可以为每个数据中心名称再绕一个循环,我想。@pozcircuitboy我刚刚拿了你的yaml和我的代码,并确认它输出的正是你想要的。这个问题和你的处境有什么不同吗?例如,您刚才说您有多个
数据中心
键,这不在问题的yaml中。我只是看到您更新了一次代码,但我错过了。它在语法上工作,但不只是选择serviceA;它将返回任何服务下的所有阵列。我更新了yaml以反映完整地图将引入的一些复杂性:多个服务和一些不具有相同数据结构的属性;还有一个现实是,有多个数据中心,我将不得不循环通过。
$hash['datacenter1'].each |$dc_key, $dc_nest_hash| {
  if $dc_nest_hash['serviceA'] {
    $dc_nest_hash['serviceA'].each |$serviceA_element| {
      notify { "thiscommand blahblah ${serviceA_element}": }
    }
  }
}
<% @hash['datacenter1'].each do |_, dc_nest_hash| -%>
  # contents of each datacenter1 nested hash in dc_nest_hash and iterate over each hash
  <%- if dc_nest_hash.key?('serviceA') -%>
    <%- dc_nest_hash['serviceA'].each do |serviceA_element| -%>
      # lookup serviceA key in each dc_nest_hash and iterate over elements
      thiscommand blahblah <%= serviceA_element %>
    <%- end -%>
  <%- end -%>>
<% end -%>