Remote-Herunterfahren einer Gruppe von Linux-Servern (SNMP / Bonjour / socat?)

572
George Hawkins

Ich habe eine Gruppe von Linux-Servern in meinem Subnetz, die ich von einem Master-Rechner aus fernsteuern kann. Ich möchte nicht, dass die Nicht-Master-Maschinen vorab mit dem Master koordiniert werden müssen, dh seine IP-Adresse usw. kennen. Etwas, das auf Broadcast- oder Multicast-Nachrichten basiert, erscheint daher naheliegend.

Ich habe bereits eine Lösung implementiert, socataber ich habe mich gefragt, ob es eine bessere, weniger ad-hoc-Lösung gibt, z. B. mit einem der etablierten Multicast-fähigen Dienste wie SNMP oder Bonjour.

Meine Lösung ist wie folgt. Auf allen Nicht-Master-Computern, die ich betreibe:

$ socat UDP4-RECVFROM:6666,broadcast,fork SYSTEM:'hostname; shutdown now' 

Dies weist darauf hin socat, Broadcast-Nachrichten auf Port 6666 abzuhören, und wenn er eine empfängt, wird der Hostname zurückgegeben und der Rechner heruntergefahren.

Jetzt kann jede Maschine im selben Subnetz alle Maschinen, auf denen dies ausgeführt wird, mit dem folgenden Befehl herunterfahren (sie wartet auf Eingaben, geben Sie also irgendetwas ein), zB bye):

$ socat STDOUT UDP4-DATAGRAM:255.255.255.255:6666,broadcast bye 

Dadurch wird die Nachricht gesendet (in diesem Fall bye). socatAnschließend werden die Hostnamen ausgegeben, die von allen Computern zurückgegeben werden, die Broadcast-Nachrichten an Port 6666 abhörten.

Bei diesem Ansatz gibt es offensichtlich keine Sicherheit. Wenn ein Computer im selben Subnetz etwas an Port 6666 sendet, werden die Systeme heruntergefahren. Man könnte eine einfache zusätzliche Ebene hinzufügen - anstatt nur zu laufen hostname; shutdown now, könnte man ein Skript ausführen, das tatsächlich überprüft, was gesendet wurde, und nur dann heruntergefahren wird, wenn z. B. eine lange Zufallszahl angezeigt wird, die nur den interessierten Parteien bekannt sein sollte.

0
Ich habe eine triviale systemd-Service-Datei geschrieben, die installiert werden kann, um den ersten der oben genannten `socat'-Befehle beim Starten auf einem Computer auszuführen. Siehe https://gist.github.com/george-hawkins/21f98e4061fed8d4bb3d9183093c0726 George Hawkins vor 7 Jahren 0
Wir freuen uns, dass Sie die Frage selbst beantwortet haben. Um dies hier auf dieser Website deutlich zu machen, sollten Sie die ANTWORT in den folgenden Antwortbereich posten und nicht einfach in Ihre Frage aufnehmen. Bitte bearbeiten Sie Ihren Beitrag, um diese Kriterien zu erfüllen. Es gibt eine zwangsweise Verzögerung zwischen dem Absenden einer Antwort auf Ihre eigene Frage und der Möglichkeit, diese als die richtige Antwort zu kennzeichnen. Diese Methode lässt jedoch klar erkennen, was die Frage ist und wie die Antwort auf diese Frage lautet. music2myear vor 7 Jahren 1
Ich habe auf eine bessere Antwort gehofft, dh ich habe meine aktuelle Herangehensweise gezeigt und gefragt, ob es eine bessere gibt, die auf einem etablierten Protokoll wie SNMP oder Bonjour basiert. Aber ich kann es in eine Antwort aufteilen (nachdem die erzwungene Verzögerung vorüber ist) und sehen, wie es bei der Abstimmung funktioniert. George Hawkins vor 7 Jahren 0
OK. Dann fehlte etwas Klarheit in Ihrem Beitrag. Wenn Sie eine bessere Antwort wünschen, ist das auch gut. Vielleicht etwas Formatierung verwenden und deinen Beitrag mit den Überschriften "Dies ist, was ich jetzt tue", "Dies ist, was es nicht tut" und "Dies ist, was ich möchte, zu tun" oder ähnliches klären Sie Ihre Anfrage, damit Sie leichter erkennen können, was los ist. music2myear vor 7 Jahren 0

2 Antworten auf die Frage

0
grawity

wird nur heruntergefahren, wenn zB eine lange Zufallszahl zu sehen ist, die nur den Interessenten bekannt sein sollte.

Wenn Sie mit dieser Koordinationsebene zufrieden sind, müssen Sie den Master-Host-SSH für alle anderen Server verwenden und den shutdownBefehl auf diese Weise ausführen . Die Server müssen nur eine lange Zufallszahl kennen, dh den öffentlichen Schlüssel des Masters.

(Der entsprechende private Schlüssel ist nicht auf einen einzelnen Master beschränkt; Sie können die ~/.ssh/id_*Datei an beliebiger Stelle kopieren .)

Bonjour / Avahi ist ein reiner Erkennungsmechanismus und unterstützt keine Broadcasting- Befehle . Sie können hier jedoch alle Maschinen im Subnetz auflisten (entweder durch den generischen "Workstation" -Dienst oder durch einen benutzerdefinierten).

Vielen Dank für Ihre Antwort. Ich verwende bereits ssh (mit RSA-Schlüsseln) für die routinemäßigen Interaktionen zwischen dem Master und einzelnen Nicht-Master / Slave-Computern. Siehe jedoch meinen Kommentar zur Antwort von @ jehutyy. Die Shutdown-Situation ist ein Eins-zu-Viele-Befehl, und der "socat" -Ansatz vermeidet das Schleifen über alle Sklaven. Ich hatte gedacht, dass vielleicht SNMP, Bonjour oder etwas anderes bereits eine weniger ad-hoc-Herangehensweise bieten (Ihre Bemerkung bezieht sich auf Bonjour). Aber vielleicht ist "socat" der beste Ansatz für mein Setup, und wenn ich mehr brauche, sollte ich mir ein volles Ressourcenmanagementsystem anschauen. George Hawkins vor 7 Jahren 0
0
jehutyy

Da Sie einen Befehl auf "Nicht-Master" ausführen müssen, gehe ich davon aus, dass es eine Art Koordinierung zwischen Master und Nicht-Master gibt. Sie können also ssh mit der ssh-Schlüsselpaar-Authentifizierung verwenden, um den Befehl wie folgt aus der Ferne auszuführen:

ssh -i /path/to/pubkey @server 'shutdown -H now' 
Dies ist eigentlich der Ansatz, den ich vor dem oben beschriebenen "socat" verwendet habe. Es gibt jedoch einen Master und viele Nicht-Master- oder Slave-Maschinen - bei diesem Ansatz muss man also alle Slaves durchlaufen. Und zu einem bestimmten Zeitpunkt ist ein Teil der Slaves bereits offline - also sieht man viele ssh-Ausfälle (keine große Sache). Aber ich dachte, Bonjour oder SNMP könnte ein guter Weg sein - man könnte fragen, wer einen "Shutdown" -Dienst ankündigt, und dann die Maschinen fragen, die geantwortet haben. George Hawkins vor 7 Jahren 0