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
}