Jak wdrażać aplikacje (w .tar.gz) za pomocą Puppet?

11

Jestem początkującym w Puppet i chciałbym wiedzieć, czy jestem na dobrej drodze do wdrażania aplikacji w Puppet.

Aplikacje znajdują się w pliku tar.gz, który zawiera plik o numerze wersji. Robię to, aby wdrożyć (wchodzę na serwer i uruchamiam ponownie klienta, aby pobrać nowy plik tar):

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"] ],
    }

Ale kiedy chcę zaktualizować, nie wiem, jak powiedzieć Puppet, aby usunąć stary katalog? Na przykład, jeśli chcę zaktualizować wersję 56 do 57: muszę usunąć katalog wersji 56.

Słyszałem o Capristrano i wydaje się, że lepiej jest używać Puppet do zarządzania pakietami, plików konfiguracyjnych i używania Capristrano do wdrażania aplikacji, prawda?

Dzięki.

Richy
źródło
Korzystam z modułu forge.puppetlabs.com do zarządzania pobieraniem / dekompresowaniem / umieszczaniem rzeczy, które są dostępne tylko jako tarballi. Działa świetnie.
jrjohnson

Odpowiedzi:

0

Chciałbym wiedzieć, czy jestem na dobrej drodze do wdrażania aplikacji za pomocą Puppet.

Nie, nie jesteś.

Należy użyć zarządzania pakietami dostępnego w systemie operacyjnym. Jeśli twoje oprogramowanie ma tar.gzformat, powinieneś je ponownie spakować lokalnie jako .deb, .rpmlub cokolwiek innego.

Jeśli oprogramowanie jest opracowywane lokalnie, powinieneś użyć wszelkich dostępnych narzędzi do kompilacji / wdrażania.

Daniel C. Sobral
źródło
10
W idealnym świecie administratorzy będą poświęcać czas na tworzenie pakietów z tarballów. W prawdziwym świecie moje doświadczenie pokazało, że tak się nie dzieje. Nasi klienci instalują wiele aplikacji, czasem bardzo dużych, z paczek tar i nie zamierzają tego zmieniać.
EmmEff
4
@EmmEff To nie jest różnica między światem idealnym a światem rzeczywistym. To różnica między miejscami „Utknęliśmy na starych drogach i nie jesteśmy gotowi na automatyczne zarządzanie konfiguracją”, a miejscami, w których działa zarządzanie konfiguracją. Widziałem oba - a nawet widziałem, jak ten drugi zmienia się w pierwszy ze zmianą administratorów.
Daniel C. Sobral
5
Masz prawo do swojej opinii. Moje obserwacje w prawdziwym świecie są inne.
EmmEff
13

Możesz spróbować użyć fpm do tworzenia RPM lub DEB twoich archiwów; jest naprawdę prosty w użyciu i nie musisz nic rozumieć na temat formatów pakietów, których nie chcesz.

Aby odpowiedzieć na twoje pierwotne pytanie, właściwym sposobem wdrażania aplikacji za pomocą Puppet jest zmusić Puppet do jak najmniejszej pracy; wszelkie skomplikowane execzasoby, które pobierają i wyodrębniają archiwum, muszą być bardzo, bardzo kruche, a uczynienie z Puppet tylko yum installpakietu jest o wiele zdrowsze na dłuższą metę.

Złota rączka 5
źródło
Wiedziałem, że to, co robię, było bardzo złe. Ale budynek rpm zawsze mnie przerażał. fpm jest moim zbawieniem. Dziękuję Handyman5. f-tak.
Brak 1
świetny komentarz. Zamiast głosić „użyj rpm” podałeś proste „użyj fałszywego rpm i użyj tego prostego narzędzia, aby to osiągnąć”.
Andre de Miranda,
6

Bardzo starałbym się spakować aplikację jako pakiet RPM lub .deb i zbudować repozytorium yum lub apt do przechowywania pakietów. Pakowanie tarballa lub zipa, który właśnie otwierasz do katalogu, jest dość łatwe (ale powinno być osobnym pytaniem). Dostępne w ten sposób opakowanie ładnie śledzi wersje i obsługuje wszystkie rzeczy, których otwarcie tarballa nie poradzi sobie dobrze.

Gdybym naprawdę nie mógł zbudować odpowiedniego pakietu, zrobiłbym coś takiego:

nodes.pp:

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

init.pp (moduły):

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

Inną alternatywą jest po prostu użycie rekurencyjnego zasobu lalek, takiego jak:

file {
    "/usr/local/apps/path/":
      source => "puppet:///modules/modulename/apps/path",
      ensure => directory,
      replace => true,
      purge   => true,
      recurse => true;
}

(w przypadku, gdy masz już nieoprawione rzeczy poprawnie na mistrzu marionetek. Prawdopodobnie potrzebujesz również pakietu, który uruchamia usługę i powiadamia o tym, jakiej usługi się kończy).

freiheit
źródło
0
file { "/usr/local/apps/path/apps-version-${old-version}":
    ensure => absent
}

Nawiasem mówiąc, robienie wszystkiego jako execs jest trochę brzydkie i może być trudne do rozwiązania, gdy wszystko zaczyna się psuć; jeśli możesz, może zachowaj rozpakowane wersje plików aplikacji na serwerze marionetek i użyj rekurencyjnego filezasobu, aby je odzyskać?

Shane Madden
źródło
0

Z pewnością preferuję pakowanie tarballa (RPM lub cokolwiek), ale kilka wskazówek:

Aby usunąć starą wersję, możesz po prostu usunąć wszystkie wersje oprócz tej, którą instalujesz. Po włączeniu dostatecznie niedawnej wersji bash i extglob możesz to zrobić rm -r /usr/local/apps/path/apps-version-!(${version}). Uważaj na wymazanie plików konfiguracyjnych i tym podobne. Możesz to zrobić, exec refreshonly => truea następnie notifyz poziomu exec instalacji.

Możesz użyć createsatrybutu zamiast unless => 'test -f ...'. Ale bardziej zrozumiałe.

chutz
źródło