Как развернуть приложения (в .tar.gz) с Puppet?

11

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

Приложения находятся в файле tar.gz, который содержит файл с номером версии. Итак, я делаю это для развертывания (я захожу на сервер и перезагружаю клиента, чтобы взять новый tarball):

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 для развертывания приложений, не так ли?

Благодарю.

Richy
источник
Я использую модуль forge.puppetlabs.com для управления загрузкой / распаковкой / размещением вещей, которые доступны только в виде тарболлов. Работает отлично.
jrjohnson

Ответы:

0

Я хотел бы знать, нахожусь ли я на правильном пути для развертывания приложений с Puppet.

Нет.

Вы должны использовать управление пакетами, доступное в вашей операционной системе. Если ваше программное обеспечение в tar.gzформате, вы должны повторно упаковать его как локально .deb, .rpmили любой другой .

Если программное обеспечение разработано локально, вам следует использовать все доступные инструменты сборки / развертывания.

Даниэль С. Собрал
источник
10
В идеальном мире администраторы не торопятся создавать пакеты из тарболлов. В реальном мире мой опыт показал, что этого не происходит. Наши клиенты устанавливают множество приложений, иногда очень больших, из tarballs и не собираются их менять.
EmmEff
4
@EmmEff Это не разница между идеальным миром и реальным миром. В этом разница между местами «мы застряли на старых путях и не готовы к автоматическому управлению конфигурациями» и местами, где управление конфигурациями работает. Я видел оба - и даже видел, как последние превращаются в первые со сменой админов.
Даниэль С. Собрал,
5
Вы имеете право на свое мнение. Мои наблюдения в реальном мире отличаются от этого.
EmmEff
13

Возможно, вы захотите попробовать использовать fpm для создания RPM или DEB из ваших tarballs; его действительно просто использовать, и вам не нужно ничего понимать о форматах пакетов, которые вам не нужны.

Чтобы ответить на ваш первоначальный вопрос, правильный способ развертывания приложений с помощью Puppet - это заставить Puppet выполнять как можно меньше работы; любые сложные execресурсы, которые загружают и извлекают tar-архивы, должны быть очень, очень хрупкими, и сделать Puppet просто yum installпакетом намного полезнее в долгосрочной перспективе.

Handyman5
источник
Я знал, что то, что я делал, было очень неправильно. Но rpm building всегда меня пугал. ФПМ мое спасение. Спасибо, Умелец5. ф-да.
8None1
отличный комментарий. Вместо того, чтобы проповедовать «используйте rpm», вы предоставили простое «используйте поддельные rpm и используйте этот простой инструмент для достижения этой цели».
Андре де Миранда
6

Я бы очень старался собрать приложение в виде пакета RPM или .deb и создать репозиторий yum или apt для хранения пакетов. Упаковка архива или архива, который вы только что открыли, в каталог довольно проста (но это должен быть отдельный вопрос). Упаковка, доступная таким образом, прекрасно отслеживает версии и обрабатывает все виды вещей, которые просто не раскрываются в тарболле.

Если бы я действительно не смог собрать правильный пакет, я бы сделал что-то вроде этого:

nodes.pp:

node 'server1.domain.com' inherits basenode {
    apps { apps:
            version    => 56,
            oldversion => 55,
            apps_name  => "apps_tarball.tgz",
    }

init.pp (модули):

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;
}

(где вы уже правильно исправили вещи на хозяине марионеток. Возможно, также потребуется какой-либо пакет, в котором запущена служба, и уведомите любую службу, из которой она работает).

Freiheit
источник
0
file { "/usr/local/apps/path/apps-version-${old-version}":
    ensure => absent
}

Кроме того, делать все как execs довольно уродливо, и может быть трудно устранить неполадки, когда что-то начинает ломаться; если вы можете, возможно, сохранить извлеченные версии файлов приложения на марионеточном сервере и использовать рекурсивный fileресурс для извлечения?

Шейн Мэдден
источник
0

Я, конечно, предпочитаю упаковывать тарбол (RPM или что-то еще), но несколько советов:

Чтобы удалить старую версию, вы можете просто удалить все версии, кроме той, которую вы устанавливаете. С достаточно недавними включенными bash и extglob вы можете rm -r /usr/local/apps/path/apps-version-!(${version}). Остерегайтесь уничтожения конфигурационных файлов и тому подобного. Вы можете сделать это, exec refreshonly => trueа затем notifyэто из exec установки.

Вы можете использовать createsатрибут вместо unless => 'test -f ...'. А вот более понятно.

chutz
источник