Учитывая структуру данных, такую как
$local_users => {
"user" => {
"ssh" => {
"config_entries" => [
{ "host" => "dummyhost",
"lines" => [
"ProxyCommand /usr/bin/corkscrew proxy.example.net 8080 %h %p"
]
}
]
}
}
}
Я собрал пару сокращенных вызовов, но не совсем уверен, существует ли более эффективный способ определить, существует ли элемент, соответствующий некоторому условию.Я думаю, что это, по крайней мере, начнёт пропускать последующие элементы, если совпадение найдено, но, кажется, немного неуклюже делает 3 сокращения вызовов, чтобы извлечь что-то глубоко вложенное, и задается вопросом, есть ли в марионетке какие-то лучшие шаблоны для извлечения данных, чтобы определить, что-тотребуется или нет.
$require_corkscrew = $local_users.reduce(false) |$memo, $user| {
$memo or dig44($user[1], ['ssh', 'config_entries'], []).reduce |$memo, $entry| {
$memo or $entry['lines'].reduce |$memo, $line| {
$memo or $line.match(/ProxyCommand.*corkscrew/)
}
}
}
if $require_corkscrew {
$corkscrew_ensure = 'present'
} else {
$corkscrew_ensure = 'absent'
}
package {'corkscrew':
ensure => $corkscrew_ensure,
}