选择一个在人偶中具有给定键值对的嵌套哈希

时间:2018-08-24 06:24:45

标签: puppet

我在hieradata中有此数据结构

server:
  host: 'foo.bar.baz'
  public_host:
    common:
      host: 'foo.bar.baz'
    internal:
      host: 'some.internal.name'
      partition:
        name: 'int'
        service_port:
          8443:
    nonvs:
      partition:
        name: 'BLA'
        manage_virtualserver: false

现在,我需要一种在$ server ['public_host']中选择具有给定键值对的完整嵌套哈希的方法。

例如我正在寻找... ['partition'] ['name'] ='BLA',将获得$ server ['public_host'] ['nonvs']

希望很清楚我想做什么。

1 个答案:

答案 0 :(得分:2)

您可以使用filter解决此问题:

  $server = lookup('server')    
  $public_host = $server['public_host']

  $filtered_data = $public_host.filter |$k, $v| {
    has_key($v, 'partition') and has_key($v['partition'], 'name')
      and $v['partition']['name'] == 'BLA'
  }

您还需要stdlib来获得has_key()函数。

如果您希望生成的哈希值包含嵌套在partition键级别的哈希值(如注释所示),则可能会尝试在数据上使用reduce

  $reduced_data = $filtered_data.reduce({}) |$memo, $x| {
    $memo + $x[1]
  }

$x是$ filtered_data中每个顶级键的[key,value]对,因此$x[1]返回顶级哈希值中的哈希值。

例如,如果$ filtered_data为{a => {d => 1}, b => {e => 2}, c => {f => 3}},则$ reduced_data将为{d => 1, e => 2, f => 3}

但是,这将无济于事,因为您最终会在生成的哈希表的顶层使用多个partition键。由于散列不可能包含重复的键,因此除一个分区外,所有分区都将被静默丢弃。

这些基于文档herehere中的一些示例。