Назад | Перейти на главную страницу

Может ли Puppet запустить сценарий оболочки (который он загружает с главного сервера) без его сохранения?

У меня есть шаг в модуле 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')
}