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