В старых версиях языка кукол нет поддержки циклов.
Но вы можете использовать массив вместо простой строки для заголовка и объявить несколько ресурсов одновременно с одинаковыми параметрами:
$b = '/opt/app'
file { [ "$b/app1", "$b/app2" ]:
ensure => directory,
owner => 'root',
group => 'root',
mode => 0644,
}
Вы также можете объявить множество ресурсов одного типа с разными параметрами, заканчивая каждый ресурс символом ;
, что немного компактнее, чем повторение file
, {
s и }
s:
file {
[ "$b/app1", "$b/app2" ]:
ensure => directory,
owner => 'root',
group => 'root',
mode => 0755;
[ "$b/app1/secret", "$b/app2/secret" ]:
ensure => directory,
owner => 'root',
group => 'root',
mode => 0700;
}
В конкретном случае файлов вы можете настроить источник и использовать рекурсию:
file { "/opt/app":
source => "puppet:///appsmodule/appsdir",
recurse => true;
}
(для этого потребуется наличие источника этой структуры каталогов для использования кукол в качестве источника)
Вы можете определить новый тип ресурса , чтобы многократно использовать часть параметра:
define foo {
file {
"/tmp/app/${title}":
ensure => directory,
owner => 'root',
mode => 0755;
"/tmp/otherapp/${title}":
ensure => link,
target => "/tmp/app/${title}",
require => File["/tmp/app/${title}"]
}
}
foo { ["app1", "app2", "app3", "app4"]: }
Начиная с Puppet 2.6, существует Ruby DSL, в котором есть все функции циклической обработки, которые вы можете запросить: http://www.puppetlabs.com/blog/ruby-dsl/ (однако я никогда не использовал его). В Puppet 3.2 они добавили экспериментальные циклы , однако эти функции могут измениться или исчезнуть в более поздних выпусках.