В глобальных переменных у меня есть хэш, похожий на строковый ключ: значение массива. Также у меня есть имя хоста из фактов.
Я пытаюсь проверить, находится ли этот хост внутри какого-либо массива хеша. Если да, значение переменной = ключ. А затем использовать эти данные.
$mygroup = undef
notice("mygroup before is: ${$mygroup}")
notify{"mygroup before is: ${$mygroup}": }
$group_servers.each |$groupserver, $servers| {
if ($hostname in $servers) {
$mygroup = $groupserver
notice("mygroup in if is: ${$mygroup}")
notify{"mygroup in if is: ${$mygroup}": }
}
}
notice("mygroup after is: ${$mygroup}")
notify{"mygroup after is: ${$mygroup}": }
Но что у меня внутри if Я получил нужные данные в переменную. Но снаружи if снова пусто...
Может быть, попробовать использовать массивы? Добавить к нему $groupserver... или в puppet он работает по-другому и все нужно положить внутрь if? Это создаст беспорядок if внутри if внутри чего-то еще. "="
п.с. Решено
$my_groups = $group_servers.filter |$value| {
$hostname in $value[1]
}
$onegroup = $my_groups.map |$g| { $g[0] }
$mygroup = $onegroup[0]
Пожалуйста, не добавляйте решения внутри вопроса. Рассмотрите возможность публикации ответа





В Puppet переменные неизменяемы в пределах одной области. Это означает, что вы не можете переназначить переменную внутри цикла или блока if и ожидать, что она сохранит свое новое значение за пределами этого блока. Вместо этого вы можете использовать другой подход для достижения своей цели.
# Initialize an empty array to collect matching group names
$mygroups = []
notice("mygroups before is: ${mygroups}")
notify{"mygroups before is: ${mygroups}": }
# Iterate through the hash to find matching group names
$group_servers.each |$groupserver, $servers| {
if $hostname in $servers {
$mygroups += [$groupserver]
notice("mygroup in if is: ${groupserver}")
notify{"mygroup in if is: ${groupserver}": }
}
}
# Set the final mygroup variable based on the collected array
$mygroup = $mygroups.empty ? undef : $mygroups[0]
notice("mygroup after is: ${mygroup}")
notify{"mygroup after is: ${mygroup}": }
Это не сработало из-за устаревших += в puppet и undef :
Переменным Puppet можно присваивать значения только один раз. В разных областях видимости могут быть разные переменные с одним и тем же именем, каждую можно назначить один раз, но присвоение одной такой переменной не видно через другую.
В первую очередь вам необходимо присвоить желаемое значение, а не полагаться на переназначение. В сложных ситуациях вам может потребоваться написать для этого специальную функцию или в некоторых случаях вы можете использовать шаблон, но в этом случае Puppet имеет встроенные функции, которые могут выполнить эту работу. Например,
$mygroup = $group_servers.reduce(undef) |$group, $kv| {
($hostname in $kv[1]) ? { true => $kv[0], default => $group }
}
Это берет последнюю замеченную группу соответствия, если имя хоста встречается более чем в одной, что, по-видимому, соответствует цели нерабочего кода в вопросе.
Многие вычисления, которые вращаются вокруг преобразования или обработки массивов и/или хэшей, могут быть записаны с использованием различных итерационных функций Puppet. Среди них сокращение, использованное выше, пожалуй, самое мощное.
Спасибо, наконец-то я сделал что-то подобное только с .filter
Сработало такое решение: $my_groups = $group_servers.filter |$value| { $hostname в $value[1] } $onegroup = $my_groups.map |$g| { $g[0] } $mygroup = $onegroup[0]