Как создать один и тот же ресурс дважды в Puppet

Мое требование состоит в том, чтобы сделать некоторые повторяющиеся настройки файлов с использованием цикла, например, следующее:

$no_of_managers = 2
$array = ['One','two','Three']


define loop() {

notice("Configuring The Manager Nodes!!")

if ($name == $no_of_managers+1) {
    notice("Loop Iteration Finished!!!")
  }
  else
  {
    notice("Iteration Number : $name \n")

    # Doing All Stuff Here 

resource {$array:}

    $next = $name + 1
    loop { $next: }
 }
 }

loop { "1":}

define resource () {
# Doing my other Stuff
notice ("The Parsed value Name : ${name}\n")

}

Теперь, когда выполняется вторая итерация, возникает следующая ошибка:

Error: Duplicate declaration: Resource[One] is already declared in file 

Как я могу преодолеть это, что я делаю, это настройка кластера. Есть ли обходной путь для этого, я новичок в кукольном деле, поэтому ваше любезное руководство высоко ценится.

Вариант использования:

Я пытаюсь настроить кластер с несколькими узлами Manager/Worker, поэтому, используя этот сценарий, пользователь имеет право выбирать, сколько ему нужно узлов менеджера. Таким образом, первый цикл предназначен для копирования необходимых файлов и создания необходимого количества узлов.

Второй цикл предназначен для отправки всех шаблонов .erb. Поскольку каждая нода имеет немного разные конфигурации, файлы .erb имеют внутри себя собственную логику.

Поэтому после каждой итерации я хочу отправить шаблоны .erb на соответствующий узел.


person ycr    schedule 21.08.2014    source источник


Ответы (1)


В Puppet 3.x вы не можете построить цикл тем способом, который пытаетесь использовать.

resource { $array: }

является циклом по содержимому $array, если хотите.

Не совсем понятно, что вы пытаетесь решить. Если вы можете конкретизировать свой вопрос, мы можем предложить реальную реализацию.

Обновлять

Если вы действительно хотите пойти по этому пути, вам нужно сгенерировать уникальные имена для ваших производных ресурсов.

$local_names = regsubst($array, '$', "-$name")

resource { $local_names: }

В вашем определенном типе вам придется восстановить исходное значение, удалив суффикс.

define resource() {
    $orig_name = regsubst($name, '-[0-9]+$', '')
    # use $orig_name where you used $name before
}

Обратите внимание, что даже экспортируемые ресурсы должны иметь уникальные имена. Таким образом, преобразование может произойти в манифесте принимающего узла.

person Felix Frank    schedule 21.08.2014
comment
Привет, я отредактировал вопрос, цикл работает отлично. У меня Кукольный 3.6.2. Да, второй цикл над массивом. - person ycr; 21.08.2014
comment
Понимаю. Строго говоря, вы только что построили рекурсивное определение;) Я обновлю свой ответ. - person Felix Frank; 21.08.2014
comment
Вау, ты действительно потрясающий... Большое спасибо... :) - person ycr; 21.08.2014