在木偶中选择一个具有给定键值对的嵌套哈希
pick a nested hash which has a given key value pair in 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']
希望大家清楚我想做什么。
您可以使用 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]
returns 顶层中的哈希哈希值。
例如,如果 $filtered_data 是 {a => {d => 1}, b => {e => 2}, c => {f => 3}}
,$reduced_data 将是 {d => 1, e => 2, f => 3}
。
但是,这对您没有帮助,因为您最终会在生成的哈希的顶层得到多个 partition
键。由于哈希不可能包含重复的键,因此除了一个分区之外的所有分区都将被静默丢弃。
我在 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']
希望大家清楚我想做什么。
您可以使用 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]
returns 顶层中的哈希哈希值。
例如,如果 $filtered_data 是 {a => {d => 1}, b => {e => 2}, c => {f => 3}}
,$reduced_data 将是 {d => 1, e => 2, f => 3}
。
但是,这对您没有帮助,因为您最终会在生成的哈希的顶层得到多个 partition
键。由于哈希不可能包含重复的键,因此除了一个分区之外的所有分区都将被静默丢弃。