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

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

Я новичок в 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.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;
}

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

Я хотел бы знать, правильно ли я развертываю приложения с помощью 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 ...'. А более понятно.