【问题标题】:Puppet - iterate over hashPuppet - 遍历哈希
【发布时间】:2017-01-26 11:40:07
【问题描述】:

我们正在使用 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 **)

然后我们遇到了重复的资源。谁能建议我如何处理该哈希?

谢谢

【问题讨论】:

  • 你想要的结果不清楚。如果data2在YAML中定义了两次,你是想只定义一次还是两次Processor::ProcessArray[data2]?如果已经定义,应该跳过它,还是应该根据处理器::hash_entry 名称唯一地定义它?
  • @DominicCleal - 道歉,应该更清楚。我希望将条目作为唯一实例处理。

标签: arrays hash iteration puppet hiera


【解决方案1】:

问题从这里开始,processor::process_array 被赋予非唯一数据作为其名称:

define processor::hash_entry ($field1, $array_data) {
    processor::process_array { ${array_data}:
        # ...

processor::hash_entry 以重叠/相同的array_data 调用两次时,会生成:

Processor::Process_array[data1]
Processor::Process_array[data2]
Processor::Process_array[data3]
Processor::Process_array[data2]

我猜是你报告的重复资源。

如果您使用唯一数据作为前缀,即processor::hash_entry 资源(或 field1,如果适用)的“item1”/“item2”名称,那么它们将是唯一的。

使用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
}

【讨论】:

  • 由于各种原因,我们无法部署完整的stdlib,但是将前缀函数放在模块中让我做我需要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2014-06-01
  • 2013-11-25
  • 2016-04-12
  • 2014-01-21
  • 1970-01-01
相关资源
最近更新 更多