Как можно развернуть архив с puppet

Я использую ansible для развертывания артефактов, созданных в jenkins. Пьеса выглядит так:

  1. Перенесите архив tar.gz на удаленный хост (архив содержит код python)
  2. остановить код Python (он был настроен как служба systemd, которая символически ссылается на скрипт внутри /home/arl/code
  3. Удалить папку /home/arl/code (рекурсивно)
  4. Извлеките файл tar.gz в /home/arl
  5. Запустите скрипт systemd для кода.

В puppet вы можете управлять услугами с помощью поставщика услуг. Но поскольку вы хотите управлять «состоянием», вы не можете объявить ресурс python_service как «остановленный», а затем в манифесте как «запущенный», поскольку это приведет к ошибке дублирования объявления. В ansible, что является императивом, это легко достижимо.

Есть ли способ добиться этого в марионетке?


person ARL    schedule 21.10.2018    source источник
comment
Вам нужно следующее: forge.puppet.com/puppetlabs/transition   -  person Matt Schuchard    schedule 22.10.2018


Ответы (1)


Для того, что вы делаете, вы хотели бы использовать ряд типов ресурсов Exec и использовать оператор упорядочения ресурсов ->. Таким образом, ваш манифест марионетки будет выглядеть примерно так:

scp_tarball_command = '/usr/bin/scp ...';
stop_python = '/usr/sbin/systemd stop whatever';
delete_code_dir = '/bin/rm -rf /home/arl/code';
untar_tarball = '/usr/bin/tar -xzf ...';
start_python = '/usr/sbin/systemd start whatever';

exec { $scp_tarball_command: creates => 'whatever'} ->
exec { $stop_python: refreshonly => true} ->
exec { $delete_code_dir: refreshonly => true} ->
exec { $untar_tarball: refreshonly => true} ->
exec { $start_python: refreshonly => true}

Подробную информацию об упорядочении ресурсов можно найти здесь: https://puppet.com/docs/puppet/5.3/types/exec.html

Также я бы предложил поместить этот код в класс и заменить жестко заданные параметры параметрами класса.

person Red Cricket    schedule 21.10.2018
comment
Эй, я знаком с отношениями и заказами, а также знаком с exec. Мне просто кажется, что так работать очень «не кукольно». Можете ли вы сказать мне, считается ли это передовой практикой или просто жизнеспособным решением? - person ARL; 21.10.2018
comment
Это своего рода некукольность, но если бы ваш код был упакован в RPM, вы могли бы лучше следовать марионеточному шаблону package >> file >> service. - person Red Cricket; 22.10.2018
comment
Если вы упаковали свой код Python в пакет Python, вы можете использовать pip как provider в объявлении ресурса package. - person Red Cricket; 22.10.2018
comment
Идея pip хороша для python. Моя основная проблема связана с ситуацией, когда файл в каталоге кода может быть заблокирован запущенным процессом. Опять же, при императивном подходе с этим довольно легко справиться. *Стоп -> *Перезаписать код -> *Старт. Например, если вы управляете nginx с помощью puppet и хотите его обновить, puppet, возможно, потребуется остановить службу перед обновлением каталога кода, а затем запустить ее снова. Я посмотрю, как некоторые другие модули достигают этого. Спасибо за совет. - person ARL; 22.10.2018