Puppet - 遍历哈希
Puppet - iterate over hash
我们正在使用 puppet 3.8(遗憾的是还不能转移到 puppet 4)
我在 hiera 中有一个散列,看起来像这样:
hash_data:
item1:
field1: 'some data'
array_data:
- data1
- data2
item2:
field1: 'other data'
array_data:
- data3
- data4
我用类似这样的代码组合了一个模块:
class processor {
$data = hiera_hash('hash_data', {})
create_resources(processor::hash_entry, $data)
}
define processor::hash_entry ($field1, $array_data) {
# .. do_something ..
# process array items
processor::process_array { $array_data :
datavar = 'somevalue'
}
}
define processor::process_array($element, $datavar) {
# do something
}
只要散列中的 array_data 字段都包含唯一字段,这就可以正常工作。但是,如果我需要放置非唯一数据,例如:
hash_data:
item1:
field1: 'some data'
array_data:
- data1
- data2
item2:
field1: 'other data'
array_data:
- data3
- data2 ( **non-unique value **)
然后我们找到了重复的资源。谁能建议我如何处理该哈希?
谢谢
问题从这里开始,其中 processor::process_array
的名称是 non-unique 数据:
define processor::hash_entry ($field1, $array_data) {
processor::process_array { ${array_data}:
# ...
当使用 overlapping/identical array_data
调用两次 processor::hash_entry
时,生成:
Processor::Process_array[data1]
Processor::Process_array[data2]
Processor::Process_array[data3]
Processor::Process_array[data2]
我猜这是您报告的重复资源。
如果您使用唯一数据作为前缀,即 processor::hash_entry
资源的 "item1"/"item2" 名称(或 field1,如果适用)那么它们将是唯一的。
使用 stdlib prefix() 函数,在所有数据*条目前加上 hash_entry 名称:
define processor::hash_entry ($field1, $array_data) {
$prefixed_array_data = prefix($array_data, "${title}-")
processor::process_array { ${prefixed_array_data}:
# ...
这将生成:
Processor::Process_array[item1-data1]
Processor::Process_array[item1-data2]
Processor::Process_array[item2-data3]
Processor::Process_array[item2-data2]
如果您需要访问 process_array
中的 data2
值而不带前缀,那么您总是可以 split $title
来取回数据。
define processor::process_array($element, $datavar) {
$split_title = split($title, '-')
$data = $split_title[1]
# do something
}
我们正在使用 puppet 3.8(遗憾的是还不能转移到 puppet 4)
我在 hiera 中有一个散列,看起来像这样:
hash_data:
item1:
field1: 'some data'
array_data:
- data1
- data2
item2:
field1: 'other data'
array_data:
- data3
- data4
我用类似这样的代码组合了一个模块:
class processor {
$data = hiera_hash('hash_data', {})
create_resources(processor::hash_entry, $data)
}
define processor::hash_entry ($field1, $array_data) {
# .. do_something ..
# process array items
processor::process_array { $array_data :
datavar = 'somevalue'
}
}
define processor::process_array($element, $datavar) {
# do something
}
只要散列中的 array_data 字段都包含唯一字段,这就可以正常工作。但是,如果我需要放置非唯一数据,例如:
hash_data:
item1:
field1: 'some data'
array_data:
- data1
- data2
item2:
field1: 'other data'
array_data:
- data3
- data2 ( **non-unique value **)
然后我们找到了重复的资源。谁能建议我如何处理该哈希?
谢谢
问题从这里开始,其中 processor::process_array
的名称是 non-unique 数据:
define processor::hash_entry ($field1, $array_data) {
processor::process_array { ${array_data}:
# ...
当使用 overlapping/identical array_data
调用两次 processor::hash_entry
时,生成:
Processor::Process_array[data1]
Processor::Process_array[data2]
Processor::Process_array[data3]
Processor::Process_array[data2]
我猜这是您报告的重复资源。
如果您使用唯一数据作为前缀,即 processor::hash_entry
资源的 "item1"/"item2" 名称(或 field1,如果适用)那么它们将是唯一的。
使用 stdlib prefix() 函数,在所有数据*条目前加上 hash_entry 名称:
define processor::hash_entry ($field1, $array_data) {
$prefixed_array_data = prefix($array_data, "${title}-")
processor::process_array { ${prefixed_array_data}:
# ...
这将生成:
Processor::Process_array[item1-data1]
Processor::Process_array[item1-data2]
Processor::Process_array[item2-data3]
Processor::Process_array[item2-data2]
如果您需要访问 process_array
中的 data2
值而不带前缀,那么您总是可以 split $title
来取回数据。
define processor::process_array($element, $datavar) {
$split_title = split($title, '-')
$data = $split_title[1]
# do something
}