# Ansible command an spezielle hosts



## OnDemand (30. Jul 2021)

Hi 

folgendes Anliegen; sagen wir es gibt 200 VM wo eine App läuft. Nun wollen wir dir die updaten via ansible. (ansible stoppt die App, lädt neue Datei hoch und startet die App auf jedem Host)

Nun kann es sein, dass eine App noch nicht update bereit ist (läuft noch ein laaanger Prozess) diese soll nicht updated werden.

Meine Idee ist nun; in unsere Admin App fragen wir alle hosts per API ab ob sie startklar sind fürs Update. Dann lasse ich mir eine Liste mit IPs geben oder Hosts und setze das Update command nur an die Server welche bereit sind. Die anderen dann später wenn sie soweit sind.

Mist es mit ansible möglich, nur an gewisse hosts das command zu senden? (Müssen die hosts im ansible Host file stehen? Ja oder) aus der Doku geht das nicht ganz so gut hervor, steht aber drin comma list of hosts.


----------



## kneitzel (30. Jul 2021)

Also erst einmal: Natürlich kann man mit Ansible gezielt bestimmte Systeme ansprechen.








						How it works
					






					www.ansible.com
				



Einfach mal um einen Überblick zu bekommen.

Wenn Ihr Systeme mit Ansible verwaltet und Du Ansible nicht kennst: Dann geh bitte auf die entsprechend Verantwortlichen zu. Die werden Dir bestimmt weiter helfen (Sie haben ja auch die Verantwortung ... wenn Du was zerhaust, dann haben sie Mehraufwände. Und wenn sie irgendwas starten, was etwas kaputt macht, dann wird das ggf. auch auf sie zurück fallen!)

Und da gibt es dann ggf. auch von Seiten der Kollegen gute Möglichkeiten, da auf den Systemen z.B. erst zu prüfen, ob das Update laufen kann/darf. Das sichert das dann ggf. auch noch zusätzlich ab. Ich bin kein Ansible Experte, daher wirklich: Hol Dir von den Fachleuten die Unterstützung! 

Und auch wichtig: Wir Entwickler mögen es nicht, wenn neben den eigentlichen Business Anforderungen auch Implementations-Vorgaben gemacht werden. Das mögen die Admins auch nicht. Also so wie nicht Entwickler vermutlich keine guten Vorgaben machen bezüglich Objektstruktur und so wirst Du als Ansible Neuling da keine wirklich guten Ideen beisteuern


----------



## OnDemand (30. Jul 2021)

Recht hast du, wollte mir aber nur schon mal paar Ideen überleben und bin bei dieser hängen geblieben 😄

vielleicht gibts ja noch bessere Lösungen 🧐 Hauptproblem ist dass die Apps teilweise lange Prozesse haben. Die müssen dann erst fertig sein bevor was neu gestartet werden kann.

vielleicht wäre es auch spannend der App zu überlassen was die sich updated?

Ginge das nicht auch? App guckt in Intervallen, ob ein Update vorliegt. Wenn ja wird gewartet bis Prozesse fertig, App zieht sich die neue Jar Datei und startet sich selber neu. 

Was passiert wenn man eine laufende jar mit einer neuen überschreibt? Eigentlich nix solange nicht neu startet oder? Die Klassen usw liegen in der jvm Bus sie beim reboot neu geladen werden, kann man das grob so sagen?


----------



## mrBrown (30. Jul 2021)

Ich würde den anderen Weg gehen und dafür sorgen, dass die App zu jedem Zeitpunkt neu startbar ist. Bei den meisten lang laufenden Jobs ist das völlig problemlos möglich.

Irgendwann braucht man das sowieso, von daher kann man das auch direkt für sowas nutzen.


----------



## kneitzel (30. Jul 2021)

Generell gibt es viele Wege. Aber lohnt es sich, eine App entsprechend anzupassen? Wenn ein Update ansteht, dann hat man evtl. schneller ein Script, welches die App zum Beenden auffordert (mit beenden der Aufgaben, also zur Not dauert es) und dann wird das Update durchgeführt. Das kann ein kleines Script sein.

Oder man baut etwas so, dass es neu gestartet werden kann (siehe Antwort von @mrBrown).

Eine laufende Anwendung aktualisieren wäre ich immer vorsichtig. Unter Linux geht es prinzipiell, denn Dateien sind da nicht blockiert, wenn sie geöffnet sind. Unter Windows sind Dateien aber gesperrt. Windows hat dafür einen Mechanismus, der beim Start Dateien austauscht / löscht. (Das merkt man bei einer Installation, wenn dann nach der Installation ein Neustart notwendig ist!

Und eine Frage ist da in der Regel auch, was für Dinge denn schon vorhanden sind. Sowohl an Tools als auch an KnowHow.


----------



## OnDemand (30. Jul 2021)

Ein langer task ist zb der Import von Daten aus einer CSV Datei. 150.000 Zeilen die Zeile für Zeile verarbeitet werden.

Nach jeder Zeile abfragen ob es weiter machen soll oder abbrechen wegen Update halte ich für seltsam. Aber vermutlich gibts da auch wieder Tools ? 🧐


----------



## mrBrown (30. Jul 2021)

NicoDeluxe hat gesagt.:


> Nach jeder Zeile abfragen ob es weiter machen soll oder abbrechen wegen Update halte ich für seltsam. Aber vermutlich gibts da auch wieder Tools ? 🧐


Java selbst bietet da ganz simple Mechanismen für, zB Interrupts für einfache Threads oder ExecutorServices, die sich beenden lassen.

Je nachdem ob und welches Framework du nutzt hat das auch was passendes integriert, Stichwort wäre zB graceful shutdown.



NicoDeluxe hat gesagt.:


> Ein langer task ist zb der Import von Daten aus einer CSV Datei. 150.000 Zeilen die Zeile für Zeile verarbeitet werden.


Lässt sich doch super aufteilen: das einlesen in irgendein sinnvolles Datenformat (zB einfach Stumpf in eine Datenbank) und dann das verarbeiten jeder Zeile.

Der Grund, warum ich es überhaupt vorgeschlagen hab: grundsätzlich brauchst du sowas sowieso.
Du musst ja grundsätzlich davon ausgehen, dass deine Anwendung jeder Zeit abstützen kann, zb wenn die Hälfte der CSV-Datei verarbeitet ist.
irgendeine Lösung für spontan stoppen und später weiter machen brauchst du also sowieso – das kann man dann auch problemlos für Updates nutzen.


----------



## OnDemand (30. Jul 2021)

Ehrlich gesagt arbeitet es die Zeilen ab, wenn was schief geht wirft das CSV Framework ne exception und logged welche Zeile kaputt war oder Daten nicht gut waren und macht dann weiter.

Die Reader laufen in einem Job aus Quartz, da ist sicher was machbar. Wenn ich aber den Job unterbreche, hab ich immer Bammel, dass er grad was in die dB speichert und da irgendwie die Hälfte vergisst und am Ende kaputte Datensätze vorliegen.

Eurer Erfahrung nach; eher der App die Updates überlassen (startet sich quasi selber neu und lädt die neue jar Datei) oder  über extern (ansible) Updates - wie es implementiert wird, erstmal egal - nur so grundsätzlich.


----------



## mrBrown (30. Jul 2021)

NicoDeluxe hat gesagt.:


> Ehrlich gesagt arbeitet es die Zeilen ab, wenn was schief geht wirft das CSV Framework ne exception und logged welche Zeile kaputt war oder Daten nicht gut waren und macht dann weiter.
> 
> Die Reader laufen in einem Job aus Quartz, da ist sicher was machbar. Wenn ich aber den Job unterbreche, hab ich immer Bammel, dass er grad was in die dB speichert und da irgendwie die Hälfte vergisst und am Ende kaputte Datensätze vorliegen.


Der Bammel ist ja auch völlig berechtigt  Eben deshalb: drüber nachdenken und eine Lösung finden, mit der das Problemlos möglich ist. Du musst in jedem Fall eine Lösung dafür finden, eben weil solche Jobs völlig zufällig unterbrochen werden können, da kann man nichts gegen tun.




NicoDeluxe hat gesagt.:


> Eurer Erfahrung nach; eher der App die Updates überlassen (startet sich quasi selber neu und lädt die neue jar Datei) oder über extern (ansible) Updates - wie es implementiert wird, erstmal egal - nur so grundsätzlich.


Immer von außen. Weniger Fehlerquellen in der App und zusätzlich mehr Kontrolle.


----------



## kneitzel (30. Jul 2021)

Was ist die Zielgruppe? Wenn man ein Produkt entwickelt und man die Zielgruppe nicht kennt, dann auf jeden Fall offen lassen. Dann nur darauf achten, dass es viele Möglichkeiten gibt.

Wenn die Zielgruppe fest ist, dann kann man sich auf das konzentrieren, was da ist. Aber selbst da ist es kritisch: wenn dann mal ein Wechsel kommt, dann war viel Arbeit für die Katz und muss angepasst werden.


----------



## thecain (31. Jul 2021)

Dafür gibts doch Spring Batch. Restart, Retry und skippen ist da alles schon dabei


----------

