Как выполнять сценарии последовательно в цикле с Puppet?

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

Вот что я пробовал:

$ cat test.pp
define my_test {
   exec { "my test task $name":
        provider => shell,
        logoutput => true,
        command => "sleep $name && echo slept for $name seconds",
    }
}

my_test { [3, 2, 1, 0]: }

$ puppet apply test.pp
Notice: Compiled catalog for my.domain.fr in environment production in 0.05 seconds
Notice: /Stage[main]/Main/My_test[0]/Exec[my test task 0]/returns: slept for 0 seconds
Notice: /Stage[main]/Main/My_test[0]/Exec[my test task 0]/returns: executed successfully
Notice: /Stage[main]/Main/My_test[3]/Exec[my test task 3]/returns: slept for 3 seconds
Notice: /Stage[main]/Main/My_test[3]/Exec[my test task 3]/returns: executed successfully
Notice: /Stage[main]/Main/My_test[1]/Exec[my test task 1]/returns: slept for 1 seconds
Notice: /Stage[main]/Main/My_test[1]/Exec[my test task 1]/returns: executed successfully
Notice: /Stage[main]/Main/My_test[2]/Exec[my test task 2]/returns: slept for 2 seconds
Notice: /Stage[main]/Main/My_test[2]/Exec[my test task 2]/returns: executed successfully
Notice: Finished catalog run in 6.27 seconds

Я также пытался использовать конструкцию [3, 2, 1, 0].each |$var| { ... } и читал документацию и очень подробная статья ttboj о циклах в Puppet, но я до сих пор не не понял.

Моя проблема, вероятно, больше связана с тем, как в конце концов работают ресурсы Puppet, но может ли кто-нибудь объяснить, как проще всего написать такую ​​простую задачу?


person Lucas Cimon    schedule 09.08.2015    source источник
comment
Вы должны заказать свои ресурсы.   -  person Felix Frank    schedule 10.08.2015
comment
Хорошо, я это уже читал. Но как это сделать в цикле? Или еще: как обеспечить порядок выполнения массива ресурсов?   -  person Lucas Cimon    schedule 10.08.2015


Ответы (1)


Я не думаю, что вы сможете сделать это только с записью массива.

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

My_test['3'] -> My_test['2'] -> My_test['1'] -> My_test['0']

Вряд ли стоит. Гораздо проще пройти лишнюю милю с самого начала.

my_test { '3': }
->
my_test { '2': }
->
my_test { '1': }
->
my_test { '0': }

Конечно, это не позволяет вам делать такие трюки, как перемещение заголовков в Hiera или куда-то еще.

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

Я советую вам проверить свою мотивацию здесь. Использование Puppet для запуска статических последовательностей скриптов означает, что вы не используете преимущества этого инструмента (системная абстракция и моделирование состояния) и сталкиваетесь с некоторыми из его недостатков, как вы уже заметили. Не проще ли просто запустить один скрипт, вызывающий по порядку все остальные? (Вы даже можете создать для этого определенный тип.)

person Felix Frank    schedule 10.08.2015
comment
+1, чтобы отстоять явный код над умным кодом. В итоге я переместил эту последовательную логику в сценарий оболочки. О каком определенном типе вы здесь говорите? Просто define { exec ... } или что-то другое? - person Lucas Cimon; 13.08.2015
comment
Кроме того: мой реальный вариант использования здесь заключается в том, что я получаю список задач из строки, разделенной запятыми, в качестве входных данных. Следовательно, я не могу статически определить задачи, как вы сделали в своем фрагменте кода. - person Lucas Cimon; 13.08.2015
comment
Да, определенный тип должен 1) генерировать сценарий с использованием шаблона, который использует список, разделенный запятыми, и 2) объявлять ресурс exec для запуска этого сценария. - person Felix Frank; 14.08.2015