Как перебирать массив в Puppet
Я хотел бы перебрать массив, который хранится как факт Facter, и для каждого элемента массива создать нового системного пользователя и каталог и, наконец, сделать вызовы API для AWS.
Пример факта: my_env => [shared1,shared2,shared3]
Как я могу перебрать массив в Puppet?
Ответы
Ответ 1
Это может работать, в зависимости от того, что вы делаете
# Assuming fact my_env => [ shared1, shared2, shared3 ]
define my_resource {
file { "/var/tmp/$name":
ensure => directory,
mode => '0600',
}
user { $name:
ensure => present,
}
}
my_resource { $my_env: }
Это будет работать, если ваши требования просты, если нет, Puppet делает это очень трудно сделать. У разработчиков Puppet есть иррациональные предубеждения против итерации, основанные на недопонимании того, как работают декларативные языки.
Если этот тип ресурса не работает для вас, возможно, вы могли бы дать лучшее представление о том, какие свойства ресурса вы пытаетесь установить из своего массива?
РЕДАКТИРОВАТЬ:
В Puppet 4 этот плачевный недостаток был наконец исправлен. Текущее состояние дел задокументировано здесь. Как сказано в документации, вы найдете примеры вышеуказанного решения во многих старых кодах.
Ответ 2
Как и марионетка 3.2, это возможно с использованием "будущего" парсера, например:
$my_env = [ 'shared1', 'shared2', 'shared3', ]
each($my_env) |$value| {
file { "/var/tmp/$value":
ensure => directory,
mode => 0600,
}
user { $value:
ensure -> present,
}
}
Смотрите также: http://docs.puppetlabs.com/puppet/3/reference/lang_experimental_3_2.html#background-the-puppet-future-parser
Ответ 3
Puppet 3.7, выпущенный в начале этого месяца, имеет новый DSL, одна из которых - итерация, проверьте следующий URL https://docs.puppetlabs.com/puppet/latest/reference/experiments_lambdas.html#enabling-lambdas-and-iteration
эти новые функции можно включить с помощью:
Настройка парсера = будущее в файле puppet.conf
или добавление переключателя командной строки --parser = future
надеюсь, что поможет
Ответ 4
ответ itbruce, вероятно, самый лучший на данный момент, но есть предложение итерации, проходящее через процесс арматуры марионетки для возможной реализации в будущем.
Ответ 5
В марионетке есть функция create_resources(). это будет очень полезно при повторении списка itmes
Ответ 6
Начиная с последней версии Puppet (6.4.2) и начиная с Puppet 4, итерация по массивам поддерживается несколькими способами:
$my_arr = ['foo', 'bar', 'baz']
Каждая функция:
$my_arr.each |$v| {
notice($v)
}
У каждой функции альтернативный синтаксис:
each($my_arr) |$v| {
notice($v)
}
Чтобы получить индекс:
Передайте второй аргумент each
:
$my_arr.each |$i, $v| {
notice("Index: $i, value: $v")
}
Сравнение с Ruby:
Обратите внимание, что эта грамматика вдохновлена Ruby, но немного отличается, и полезно показывать два рядом, чтобы избежать путаницы. Руби позволит:
my_arr.each do |v|
notice(v)
end
Или же:
my_arr.each { |v|
notice(v)
}
Другие итерационные функции:
Обратите внимание, что Puppet предоставляет ряд других итерационных функций:
-
each
- повторяет блок кода несколько раз, используя набор значений, чтобы каждый раз предоставлять разные параметры.
-
slice
- повторяет блок кода несколько раз, используя в качестве параметров группы значений из коллекции.
-
filter
- использует блок кода для преобразования структуры данных путем удаления несовпадающих элементов.
-
map
- использует блок кода для преобразования каждого значения в структуре данных.
-
reduce
- использует блок кода для создания нового значения или структуры данных путем объединения значений из предоставленной структуры данных.
-
with
- Оценивает блок кода один раз, выделяя его в своей локальной области видимости. Он не повторяется, но имеет семейное сходство с итерационными функциями.
Кукольный 3 и ранее:
Если вы унаследовали старый код, все еще используя Puppet 3, принятый ответ по-прежнему правильный:
define my_type {
notice($name)
}
my_type { $my_arr: }
Обратите внимание, что это обычно считается плохим стилем в современной Puppet.