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.
puppet
deployment
Richy
źródło
źródło
Odpowiedzi:
Nie, nie jesteś.
Należy użyć zarządzania pakietami dostępnego w systemie operacyjnym. Jeśli twoje oprogramowanie ma
tar.gz
format, powinieneś je ponownie spakować lokalnie jako.deb
,.rpm
lub cokolwiek innego.Jeśli oprogramowanie jest opracowywane lokalnie, powinieneś użyć wszelkich dostępnych narzędzi do kompilacji / wdrażania.
źródło
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
exec
zasoby, które pobierają i wyodrębniają archiwum, muszą być bardzo, bardzo kruche, a uczynienie z Puppet tylkoyum install
pakietu jest o wiele zdrowsze na dłuższą metę.źródło
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:
init.pp (moduły):
Inną alternatywą jest po prostu użycie rekurencyjnego zasobu lalek, takiego jak:
(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).
źródło
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
file
zasobu, aby je odzyskać?źródło
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 => true
a następnienotify
z poziomu exec instalacji.Możesz użyć
creates
atrybutu zamiastunless => 'test -f ...'
. Ale bardziej zrozumiałe.źródło