У меня есть шаг в модуле Puppet, который примерно выполняет следующие действия для настройки некоторых ключей приложения:
file { '/root/setup_app_keys.sh':
ensure => file,
owner => 'root',
group => 'root',
mode => '0700',
source => 'puppet:///modules/app_module/setup_app_keys.sh',
}
exec { 'setup_app_keys':
unless => '/etc/pki/tls/private/app-foo.key',
command => '/root/setup_app_keys.sh',
user => 'root',
group => 'root',
}
В setup_app_keys.sh
скрипт слишком длинный, чтобы его можно было сделать (читаемым) однострочным, поэтому я сохраняю его в файловой системе машины и выполняю оттуда. Он создает свои файлы в /etc/pki...
и это работает достаточно хорошо.
Раздражает то, что сценарий оболочки - это в основном одноразовая вещь. Он никогда не должен запускаться снова в течение всего срока службы машины, и все же он должен оставаться в файловой системе, в которой Puppet хранил его. Если он будет удален, Puppet восстановит его снова.
Я думаю, должен быть способ переписать это, используя exec
эксклюзивно, что позволит мне при необходимости загрузить сценарий у мастера марионеток, выполнить его один раз, а затем отказаться от сценария (или вообще не сохранять его). Но все, что я пробовал, было в форме:
command => 'puppet:///modules/app_module/setup_app_keys.sh',
или
command => 'curl http://__[various puppetmaster URLs]__ | sh',
и ни один из подходов не работает. Я прошу слишком многого, или этот подход ошибочен?
Вы можете попробовать поставить свой file
в переходное состояние существования до исполнения. Конечное состояние будет
ensure => absent
На момент написания это сокращает возрастной материал. Ваш пробег может отличаться.
вы можете добавить в свой 'exec'
require => File["/root/setup_app_keys.sh"],
refreshonly => true,
поэтому он будет работать снова, только если вы измените скрипт
или вы можете добавить в свой «файл» после последнего запуска
ensure => purged,
для этого, я думаю, лучше использовать ansible или mcollective, для такого рода вещей я использую ansible.
Для получения дополнительной информации об этом.
http://docs.ansible.com/intro_getting_started.html
Вы можете запустить команду из шаблона:
exec { 'my-command':
command => template('template-for-my-command.erb')
}