Я мог бы добавить «notify» в exec, но я не хочу перезапускать свой сервис для каждого файла, и похоже, что стрелка notify chaining не работает после каждого цикла.
Важно понимать, что код в манифесте Puppet описывает только то, как создать каталог , который, в свою очередь, описывает желаемую конфигурацию вашего сервера.В каталоге перечислены объявленные классы и ресурсы, их параметры и свойства, а также взаимосвязи между ними.Логика в манифесте не отображается на действия, выполняемые при применении результирующего каталога;это отражается только в том, какие классы и ресурсы каталогизированы, и каковы их параметры, свойства и отношения.
Таким образом, когда вы используете одну из стрелок в манифесте, вы даете указание разработчику каталога:записывать отношения между двумя ресурсами в каталоге, а не явную инструкцию для применения или обновления ресурса.Ни один объявленный ресурс не будет применен более одного раза или обновлен больше, чем применен.Поэтому будет очень хорошо поместить соответствующее цепное выражение в ваш цикл, но вы не можете сделать это, просто поместив объявление Service
внутри цикла, потому что это приведет к его множественному объявлению.Таким образом, вы можете выполнить любое из следующих действий:
Объявить службу (один раз) и использовать ссылку на ресурс в ней в выражении цепочки внутри цикла:
class app_cfg {
service { 'app':
ensure => running,
enable => true,
}
['file1', 'file2', 'file3'].each |String $file| {
exec {"sed -i 's/bar/foo/g' $file":
path => ['/bin'],
onlyif => 'grep "bar" $file 2>/dev/null',
cwd => '/opt/app/config/',
} ~> Service['App']
}
}
Как и выше, но используйте соответствующий метапараметр ресурса вместо цепного выражения:
class app_cfg {
service { 'app':
ensure => running,
enable => true,
}
['file1', 'file2', 'file3'].each |String $file| {
exec {"sed -i 's/bar/foo/g' $file":
path => ['/bin'],
onlyif => 'grep "bar" $file 2>/dev/null',
cwd => '/opt/app/config/',
notify => Service['app'],
}
}
}
Или объявите отношения с помощью сборщика:
class app_cfg {
['file1', 'file2', 'file3'].each |String $file| {
exec {"sed -i 's/bar/foo/g' $file":
path => ['/bin'],
onlyif => 'grep "bar" $file 2>/dev/null',
cwd => '/opt/app/config/',
tag => 'app_notifier',
}
}
Exec<|tag == 'app_notifier|>
~> service { 'app':
ensure => running,
enable => true,
}
}