Як розгорнути програми (в .tar.gz) за допомогою лялечки?


11

Я початківець з 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"] ],
    }

Але, коли я хочу оновити, я не знаю сказати, що Лялька видаляє старий каталог? Наприклад, якщо я хочу оновити версію 56 до 57: я повинен видалити каталог версій 56.

Я чув про Capristrano і, здається, краще використовувати Puppet для манагінінг-пакетів, конфігураційних файлів та використання Capristrano для розгортання програм, чи не так?

Спасибі.


Я використовую модуль forge.puppetlabs.com для управління завантаженням / розпакуванням / розміщенням речей, доступних лише у вигляді тарболів. Це чудово працює.
jrjohnson

Відповіді:


0

Мені хотілося б знати, чи я на правильному шляху розгортання програм із Puppet.

Ні ти не.

Ви повинні використовувати управління пакетами, доступні у вашій операційній системі. Якщо ваше програмне забезпечення у tar.gzформаті, вам слід перепакувати його локально як .deb, .rpmабо будь-який інший.

Якщо програмне забезпечення є розробленим на місцевому рівні, ви повинні використовувати будь-які інструменти для складання / розгортання для нього.


10
У ідеальному світі адміністратори знайдуть час для створення пакетів з тарболів. У реальному світі мій досвід показав, що цього не відбувається. Наші клієнти встановлюють багато програм, іноді дуже великих додатків, із тарболів і не мають наміру змінювати це.
EmmEff

4
@EmmEff Це не різниця між ідеальним та реальним світом. Це різниця між місцями "Ми дотримуємося старих способів і не готові до автоматичного керування конфігурацією" та місцями, де працює управління конфігурацією. Я бачив і те, і навіть бачив, як останні перетворюються на перші зі зміною адміністраторів.
Даніель К. Собрал

5
Ви маєте право на свою думку. Мої спостереження в реальному світі відрізняються від цього.
EmmEff

13

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

Щоб відповісти на своє первісне запитання, правильним способом розгортання програм із Лялькою є те, щоб зробити Лялечку якомога менше роботи; будь-які складні execресурси, які завантажують та витягують тарболи, повинні бути дуже, дуже крихкими, і зробити Лялечку просто yum installпакетом набагато здоровіше довгостроково.


Я знав, що роблю, було так дуже неправильно. Але будівля оборотів завжди мене лякало. fpm - це моє порятунок. Дякую, підручник5. f-так.
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;
}

(там, де ви вже правильно розпізнали речі про майстра ляльок. Напевно, також потрібен будь-який пакет, на якому працює служба, і повідомляти про те, яку службу вичерпаєте)


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це з інсталяційного інструменту.

Ви можете використовувати createsатрибут замість unless => 'test -f ...'. Але більш зрозумілим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.