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

есть ли способ запустить команду до того, как марионетка внесет изменение?

Я хочу, чтобы марионетка выполняла определенную команду перед выполнением каких-либо изменений. Я знаю о prerun_command в главном файле puppet.conf, но это не то, что я ищу. Я хочу, чтобы команда запускалась только в том случае, если что-то вот-вот изменится, а не при каждом запуске марионетки.

Вот сценарий. Допустим, у меня есть куча веб-серверов за балансировщиком нагрузки. Затем я хочу, чтобы марионетка обновляла файлы веб-сайта. Но для предотвращения проблем, когда некоторые файлы были обновлены, а другие нет, а смешанные версии вызывают проблемы, я хочу вывести сервер из пула балансировщика нагрузки.
Я мог бы написать сценарий, который при запуске скажет балансировщику нагрузки удалить ящик из пула. Затем марионетка может внести изменения и использовать postrun_command чтобы положить коробку обратно в бассейн после завершения. Но мне нужен способ запустить этот сценарий, чтобы удалить сервер из пула.


Единственное решение, которое я могу придумать, - это хранить в коробке 2 копии файлов. Одна промежуточная копия, и когда марионетка обновляет ее, используйте действие уведомления, чтобы запустить сценарий удаления, а затем скопируйте из промежуточной копии в текущее местоположение. Но я надеялся на что-то более общее, что подействует на любой выполняемое изменение (обновление пакета, перезапуск службы, создание пользователя, что угодно).

Основное предназначение марионетки - управление конфигурацией. Другими словами, он будет обеспечивать соблюдение декларируемых вами конфигураций. Что вам нужно (исходя из сценария, который вы изложили в своем вопросе), так это командование и контроль. Как отмечает @Mike, ткань - это один из вариантов. Мне лично нравится Marionette Collective, так как это продукт Puppet Labs и хорошо сочетается с внутренним устройством Puppet (фактами и т. Д.).

Вот мои 2 цента. Вы можете сделать это в марионетке, но я всегда обнаруживал, что развертывание веб-приложений с марионеткой очень беспорядочно. Конечно, это сработает, но что происходит, когда вам нужно быстро вернуться. не произойдет с марионеткой.

Я бы посмотрел на инструмент развертывания, такой как ткань

http://docs.fabfile.org/en/1.4.3/index.html

Это позволит вам запускать команды на всех веб-узлах для обработки развертываний. Так что прямо перед развертыванием вы можете, например, остановить веб-сервер ... а затем запустить его резервную копию, когда развертывание завершится.

РЕДАКТИРОВАТЬ

Вот урезанный пример того, что вы можете делать в марионетке

Итак, у вас есть файл, но вам нужно выполнить команду, прежде чем файл будет изменен?

file { "/path/to/file":
  ensure  => file,
  require  => Exec['command to run'],
}

Таким образом, команда будет запущена до того, как файл потребуется изменить из-за необходимости.

Я поигрался с несколькими разными методами, и окончательным решением стал сценарий-оболочка.

Скрипт вызывается вместо puppet agent всякий раз, когда происходит пробег.

  1. Он устанавливает FACTER_ переменная env, которая init.pp ищет. Если init.pp не находит переменную, это fail()s с сообщением об ошибке.
  2. Сначала запускается сценарий puppet agent --noop --onetime --no-daemonize --verbose --color=false | grep -q ' (noop)$' (он немного умнее этого, так как он также проверяет puppet agent запустить для кодов ошибок. Он также не может использовать --detailed-exitcodes из-за ошибка 6322.)
  3. Если вышеуказанное соответствует (noop)$, он удаляет сервер из балансировщика нагрузки и снова запускает марионетку без --noop, и с --detailed-exitcodes.
  4. Если запуск завершается с 0 или 2, сценарий выполняет несколько дополнительных проверок, чтобы убедиться, что все службы работают должным образом, а затем помещает коробку обратно в балансировщик нагрузки.