Подтвердить что ты не робот

Как перебирать массив в Puppet

Я хотел бы перебрать массив, который хранится как факт Facter, и для каждого элемента массива создать нового системного пользователя и каталог и, наконец, сделать вызовы API для AWS.

Пример факта: my_env => [shared1,shared2,shared3]

Как я могу перебрать массив в Puppet?

4b9b3361

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

Ответ 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.