Я новичок в Puppet и хотел бы знать, правильно ли я развертываю приложения с помощью Puppet.
Приложения находятся в файле tar.gz, который содержит файл с номером версии. Итак, я делаю это для развертывания (я захожу на сервер и перезапускаю клиента, чтобы получить новый архив):
nodes.pp
node 'server1.domain.com' inherits basenode {
apps { apps:
version => 56,
apps_name => "apps_tarball.tgz",
}
init.pp (modules)
exec {"apps_wget":
command => "/usr/bin/wget http://web_server/${version}-${apps_name} -O /tmp/${container_zip_name}",
unless => "test -f /tmp/${version}-${apps_name}",
require => [ Package["wget"] ],
}
exec {"apps_unzip":
cwd => "/usr/local/apps/path",
command => "/usr/bin/unzip /tmp/${version}-${apps_name}",
unless => "test -f /usr/local/apps/path/apps-version-${version}",
require => [ Package["unzip"], Exec["container_wget"] ],
}
Но когда я хочу выполнить обновление, я не знаю, чтобы сказать Puppet, чтобы удалить старый каталог? Например, если я хочу обновить версию 56 до 57: я должен удалить каталог версии 56.
Я слышал о Capristrano, и мне кажется, что лучше использовать Puppet для управления пакетами, файлами конфигурации и использовать Capristrano для развертывания приложений, не так ли?
Спасибо.
Вы можете попробовать использовать fpm создавать RPM или DEB из ваших архивов; он действительно прост в использовании, и вам не нужно ничего понимать в форматах пакетов, которые вам не нужны.
Чтобы ответить на ваш исходный вопрос, правильный способ развертывания приложений с помощью Puppet - заставить Puppet выполнять как можно меньше работы; любой сложный exec
ресурсы, которые загружают и распаковывают архивы, обязательно будут очень и очень хрупкими, поэтому Puppet просто yum install
пакет намного полезнее в долгосрочной перспективе.
Я бы очень постарался связать приложение как пакет RPM или .deb и создать репозиторий yum или apt для хранения пакетов. Упаковать tarball или zip, который вы только что открываете, в каталог довольно просто (но это должен быть отдельный вопрос). Доступная таким образом упаковка хорошо отслеживает версии и обрабатывает все виды вещей, с которыми простое открытие tarball не справится.
Если бы я действительно не мог собрать правильный пакет, я бы сделал что-то вроде этого:
node 'server1.domain.com' inherits basenode {
apps { apps:
version => 56,
oldversion => 55,
apps_name => "apps_tarball.tgz",
}
file {
[ "/usr/local/apps/path/apps-version-${oldversion}", "/tmp/${oldversion}-${apps_name}" ]:
recurse => true,
ensure => absent;
}
exec {
"apps_wget_${apps_name}":
command => "/usr/bin/wget http://web_server/${version}-${apps_name} -O /tmp/${container_zip_name}",
logoutput => on_failure,
creates => "/tmp/${version}-${apps_name}",
require => [ Package["wget"] ];
"apps_unzip_${apps_name}":
cwd => "/usr/local/apps/path",
command => "/usr/bin/unzip /tmp/${version}-${apps_name}",
creates => "/usr/local/apps/path/apps-version-${version}",
require => [ Package["unzip"], Exec["container_wget"], Exec["apps_wget_${apps_name}] ];
}
Другая альтернатива - просто использовать рекурсивный ресурс марионетки, например:
file {
"/usr/local/apps/path/":
source => "puppet:///modules/modulename/apps/path",
ensure => directory,
replace => true,
purge => true,
recurse => true;
}
(где вы уже правильно разобрали вещи на мастере марионеток. Возможно, также потребуется любой пакет, в котором запущена служба, и уведомить любую службу, из которой он работает).
Я хотел бы знать, правильно ли я развертываю приложения с помощью Puppet.
Нет, ты не.
Вы должны использовать управление пакетами, доступное в вашей операционной системе. Если ваше программное обеспечение в tar.gz
формат, вы должны переупаковать его локально как .deb
, .rpm
или что угодно.
Если программное обеспечение разрабатывается локально, вы должны использовать любые доступные для него инструменты сборки / развертывания.
file { "/usr/local/apps/path/apps-version-${old-version}":
ensure => absent
}
Кстати, делать все как руководители - это некрасиво, и может быть трудно устранить неполадки, когда что-то начинает ломаться; если можете, сохраните извлеченные версии файлов приложения на марионеточном сервере и используйте рекурсивный file
ресурс для извлечения?
Я, конечно, предпочитаю упаковывать tarball (RPM или что-то еще), но несколько советов:
Чтобы удалить старую версию, вы можете просто удалить все версии, кроме той, которую вы устанавливаете. С включенными достаточно свежими bash и extglob вы можете rm -r /usr/local/apps/path/apps-version-!(${version})
. Остерегайтесь уничтожать файлы конфигурации и тому подобное. Вы можете сделать exec
refreshonly => true
а потом notify
это из установочного exec.
Вы можете использовать creates
атрибут вместо unless => 'test -f ...'
. А более понятно.