我有一个哈希,由yaml通过stdlib构建,其中包含哈希中的数组。以下是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文件添加一些任意数据。我正在尝试让所有服务器为给定的数据中心提供serviceA,在本例中为datacenter1:
thiscommand blahblah server1
thiscommand blahblah server2
thiscommand blahblah server3
thiscommand blahblah server4
thiscommand blahblah server5
我广泛使用这个地图用于各种各样的事情,但这是第一个我不能在puppet中设置变量并在erb中作为单个数组迭代的情况。
EDIT1: 这个数据来自木偶,但我试图通过template()在erb中使用它。
EDIT2: 请注意,此代码永远不会针对datacenter3运行,因为此代码特定于运行serviceA的数据中心。
EDIT3: 这是最终工作的形式: <%@hash ['datacenter1']。values.each do | v | %GT;
<%- if v.is_a?(Hash) and v.has_key?('serviceA') -%>
<% v['serviceA'].each do |myservice| %>
thiscommand blah blah <%= myservice -%>
<% end %>
<% end %>
答案 0 :(得分:1)
目前还不清楚你是否想在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}": }
}
}
}
https://docs.puppet.com/puppet/4.9/function.html#each
Ruby中的ERB在通过Puppet template
函数之前(注释是对这个答案的解释;在实际形成模板之前删除):
<% @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 -%>
https://ruby-doc.org/core-2.1.1/Object.html#method-i-enum_for