Я хочу запустить ресурс exec марионетки на основе обновления файла. Что-то вроде:
File { '/tmp/foo.bar':
audit => content,
} ~>
exec { 'deployment':
command => 'do_something_meaningful.sh',
}
Но это выполняется при каждом запуске марионетки. Даже если файл не изменился. Итак, я попробовал атрибут exec refreshonly
. Но при этом exec не выполняется при первом применении марионетки. Я думаю, это потому, что еще нет контрольной суммы md5 в state.yml
. Он отлично работает со второй попытки.
Мой текущий обходной путь выглядит примерно так:
File { '/tmp/foo.bar':
audit => content,
}
exec { 'deployment_on_change':
command => 'do_something_meaningful.sh',
refreshonly => true,
subscribe => File['/tmp/foo.bar']
}
exec {'deployment_on_first_run':
command => 'do_something_meaningful.sh',
onlyif => 'test ! -f marker.file',
subscribe => File['/tmp/foo.bar']
} ->
file { 'marker.file':
ensure => present
}
Есть ли более элегантный способ решить эту проблему?
Вы заставляете Puppet делать то, для чего он не предназначен. Выполняя это, вы только продляете каждый запуск Puppet. А ты этого не хочешь.
Просто используйте cron
job, который проверит, не изменилось ли что-то.
file{'/usr/bin/local/do_something_meaningful':
ensure => present,
owner => 'myuser',
mode => '0755',
source => 'puppet:///modules/my_module/do_something_meaningful.sh',
}
cron { 'do_something_meaningful':
command => '/usr/bin/local/do_something_meaningful',
user => 'myuser',
hour => ['8-17'],
minute => '*/30',
require => File['/usr/bin/local/do_something_meaningful'],
}
Если вы развертываете код с помощью другого инструмента, вам следует подключить do_something_meaningful.sh
в процесс развертывания. Puppet хорош для обеспечения существования некоторых ресурсов (файлов, пакетов, служб и т. Д.).