Выбрать вложенный хеш, который имеет заданную пару ключ-значение в марионетке

У меня есть эта структура данных в 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 ответ

Решение

Вы можете решить эту проблему, используя 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 является парой [ключ, значение] для каждого из ключей верхнего уровня в $ Filter_data, поэтому $x[1] возвращает Хэши внутри Хэшей верхнего уровня.

Например, если $ Filter_data {a => {d => 1}, b => {e => 2}, c => {f => 3}}, $ selected_data будет {d => 1, e => 2, f => 3},

Это не поможет вам, однако, потому что вы бы в конечном итоге с несколькими partition ключи на верхнем уровне вашего результирующего хэша. Поскольку хэш не может содержать дубликаты ключей, все разделы, кроме одного, будут молча отброшены.

Они основаны на некоторых примерах в документах здесь и здесь.

Другие вопросы по тегам