[sage-ka] Steuerung/Synchronisierung eines nächtlichen Updates

Andreas Jellinghaus aj at dungeon.inka.de
Fr Mär 27 15:20:50 CET 2009


Am Freitag 27 März 2009 09:16:02 schrieb Frederik Ramm:
> Der Plan ist daher: Nachts nimmt ein Kontrollrechner C zuerst A aus dem
> DNS heraus, schickt dann an A den "aktualisiere Dich"-Befehl, wartet,
> bis A Erfolg meldet (pollen oder aktiv benachrichtigt werden), tut dann
> A wieder ins DNS rein und nimmt B raus, lässt B aktualisieren, und nimmt
> dann B wieder ins DNS.
>
> Machen Profis sowas mit SNMP, oder gibt es da andere geeignete
> "Frameworks", mit denen ich im Rahmen dieser einfachen Aufgabe mal ein
> bisschen Erfahrung sammeln kann?

von einem rechnern aus auf verschiedenen rechnern aufgaben steuern?
das geht natürlich mit shell scripten und ssh hacks. da du aber nach
frameworks fragst:
 - cfengine hat "cfrun" oder? damit könnte man einem rechner befehlen
   etwas zu tun.
 - puppet würde ich heute vermtulich cfengine vorziehen. beides sind
   große, komplexe systeme, für meinen geschmack deutlich zu groß
   und komplex. "ist doch ganz einfach" mag ja sein, aber die versteckte
   komplexität im hintergrund ist nicht ohne, wenn man mal was debuggen
   muss.

man kann natürlich auch web server misbrauchen um programme anzustossen.
aber zumindest aus apache programme zu starten ist eine mega qual
(zumindest wenn man mod_perl verwendet), ich hab da ganz üble hacks mit
fork/exec und broken pipes und was-nicht-allem im hinterkopf. vielleicht
gehts ja heutzutage besser, aber ich würde davon abraten. zudem, falls
die befehle als root laufen müssen: apache und root ist eine kombination,
die man nur nutzen sollte, wenn man genau weis, was man da macht.

hmm, befehle auf fremden rechnern ausführen: das kann auch nagios!
aber einen 3h job? mehrere aufgaben in reihenfolge bringen? nee, würde
ich gar nicht erst versuchen, auch wenn es vielleicht geht.

ich bin ja ein fan davon: 1.) kleine, modulare programme zu haben
und 2.) möglichst viel bekannte und bewährte technologie einzusetzen.
wenn man selbst was basteln will so wäre eine idee für mich eine
zentrale datenbank, mit einer einzigen simplen tabelle. dazu ein
paar kleine programme (eines pro aufgabe), die auf der datenbank pollen
ob ihre kleine simple aufgabe gemacht werden soll, wenn ja, ein feld
von "TODO" auf "PROCESSING" setzen und nachher auf "FAILED" oder "DONE".
dazu ein script, das den ersten auftrag einstellt, wartet bis er fertig
ist, den nächsten einstellt etc. log files können alle ganz simpel lokal
erzeugen (und/oder nachher in ein blob werfen, wenn man das will). datenbanken
mit trivialen tabellen sind allseits bekannt, wie man die über netz sicher
bekommt auch. ein select alle 10 sekunden sollte auch bei 5-10 verbindungen
die datenbank nicht nerven.

bei so einer umsetzung find ich nett:
* ich kann jeden teil modular abschalten, und dann im debugger anwerfen um
  nachzusehen was schief läuft
* keine remote triggern/ausführen auf fremden rechnern, mit allen möglichen
  netz problemen, sondern "nur" sehr übersichtliches pollen einer datenbank - 
  ist IMO eine super bekannte sache, bei der man wenig neues erwartet.
* datenbank und deren verbindung sichern und deren rechte etc. ist einfach,
  kennt hoffentlich jeder. cfengine und puppet mit ihren rsa keys bzw. der
  eingebauten ca finde ich dagegen ein wenig unschön. aber das ist geschmack.
* bei ssh und co müsste man sichern, welcher key als was einloggen darf,
  und dann rechte runterschrauben (passender account, befehl isolieren,
  gedanken über probleme mit parametern oder environment etc.). per datenbank
  reicht ein id und ein feld mit den werten TODO/PROCESSING/FAILED/DONE, das
  kann man gut matchen, keine sicherheitsbedenken das ein angreifer von A
  nach B über vor-konfigurierte ssh verbindungen hüpfen kann etc.

was ich beschreibe ist natürlich sowas wie ein rudimentäres, handgestricktes
message queueing system. da gibts auch große software in dem bereich, aber
dann kann man auch gleich bei cfengine oder "whatever" bleiben, denn klein,
kompakt und leich verständlich hat man dann nicht.

auf keinen fall würde ich "mal eben schnell" was eigenes werkeln für die
synchronisierung von einem rechner zum anderen. klar, egal ob perl oder c,
was simples geht mit wenigen befehlen. aber eigener netzwerk-code hat meistens
massive lücken in der fehlerbehandlung oder ist unsicher, und wieviele 
kollegen solchen code bei bedarf verstehen und erweitern können, da bin
ich skeptisch. SQL/datenbank dagegen kann jeder, kennt jeder, und wenn man
als bei werk, die logic von den einzelnen modulen sauber getrennt hat,
und als zentrales organ eine datenbank hat, und damit keine probleme wegen
stabilität, performance, und die auch einfach zu debuggen ist, das find ich 
nett.

Soweit meine Überlegungen. Was fällt euch dazu ein?

Tschüss, Andreas