In einer TXT-Datei befindet sich eine Liste mit IP-Adressen, z.
1.1.1.1
2.2.2.2
3.3.3.3
Hinter jeder IP-Adresse steht ein Server und auf jedem Server läuft ein SSHD auf Port 22. Nicht jeder Server ist in der known_hosts
Liste (auf meinem PC Ubuntu 10.04 LTS / bash).
Wie kann ich Befehle auf diesen Servern ausführen und die Ausgabe erfassen?
Idealerweise möchte ich die Befehle auf allen Servern parallel ausführen.
Ich verwende die Authentifizierung mit öffentlichem Schlüssel auf allen Servern.
Hier sind einige mögliche Fallstricke:
- Der SSH fordert mich auf, den angegebenen SSH-Schlüssel des Servers in meine
known_hosts
Datei zu übernehmen. - Die angegebenen Befehle geben möglicherweise einen Exit-Code ungleich Null zurück, der angibt, dass die Ausgabe möglicherweise ungültig ist. Ich muss das erkennen.
- Eine Verbindung zu einem bestimmten Server kann möglicherweise nicht hergestellt werden, z. B. aufgrund eines Netzwerkfehlers.
- Es sollte eine Zeitüberschreitung geben, falls der Befehl länger als erwartet ausgeführt wird oder der Server während der Ausführung des Befehls ausfällt.
Die Server sind AIX / ksh (aber ich denke, das ist eigentlich egal.
ssh
scripting
parallelism
LanceBaynes
quelle
quelle
Antworten:
Angenommen, Sie sind nicht in der Lage, pssh oder andere zu installieren, können Sie Folgendes tun:
quelle
-o StrictHostKeyChecking=no
, um dies zu vermeiden. Es ist jedoch besser, zuerst alle Server über eine Befehlszeile zu scannen, damit die Hostschlüssel hinzugefügt werden können.wait
Befehl fordert diese Ressourcen zurück, einschließlich des Rückkehrcodes des Prozesses (wie die Prozesse beendet wurden). Wenn Sie später im Programm einen anderen Prozess, zum Beispiel eine Komprimierung, in den Hintergrund stellen und darauf warten müssen, wird ohne diese Schleife eines der abgeschlossenen ssh-Programme zurückgefordert, nicht die Komprimierung - was möglicherweise immer noch der Fall ist in Betrieb sein. Sie erhalten einen Rückgabestatus für den falschen untergeordneten Prozess. Es ist gut, nach sich selbst aufzuräumen.Es gibt verschiedene Tools, mit denen Sie sich auf mehreren Computern gleichzeitig anmelden und eine Reihe von Befehlen ausführen können. Hier sind ein paar:
quelle
Wenn Sie mehr mit Python- Skripten als mit
bash
Skripten zu tun haben , ist Fabric möglicherweise das richtige Werkzeug für Sie.Von der Fabric-Homepage :
quelle
Ich benutze GNU parallel dazu , insbesondere können Sie dieses Rezept verwenden:
Mit
your.txt
der Datei mit der Server-IP-Adresse / Namen.quelle
ssh
auch schon früher gemacht, aber Sie müssen sich auf eine Art und Weise bei den anderen Computern anmelden und diese Art und Weise war früher weniger sicher (wiersh
). Sie beschreiben nicht, was Sie jetzt verwenden, um von Maschine zu Maschine zu gelangen (telnet
?,rsh
?).Sehr einfaches Setup:
Die Authentifizierung mit Name / Passwort ist wirklich keine gute Idee. Sie sollten dafür einen privaten Schlüssel einrichten:
quelle
ssh $host $command
für jeden Host ausgeführt. Versuchen Sie, diese Befehle manuell auszuführen, um herauszufinden, was gerade passiert.Ich schlage Ansible.cc vor . Es ist ein Konfigurationsmanager und ein Befehlsverteiler.
quelle
Ich denke, Sie suchen nach pssh und den zugehörigen parallelen Versionen des üblichen scp, rsync usw.
quelle
Ich habe ein Open-Source-Tool namens Overcast entwickelt , um dies zu vereinfachen.
Zuerst definieren Sie Ihre Server:
Anschließend können Sie mehrere Befehle und Skriptdateien nacheinander oder parallel ausführen.
quelle
Das Hypertable- Projekt hat kürzlich ein Multi-Host-SSH-Tool hinzugefügt. Dieses Tool wurde mit libssh erstellt und stellt Verbindungen her und gibt Befehle asynchron und parallel aus, um maximale Parallelität zu erzielen . Eine vollständige Dokumentation finden Sie unter SSH-Tool für mehrere Hosts . Um einen Befehl auf einer Reihe von Hosts auszuführen, führen Sie ihn wie folgt aus:
Sie können auch einen Hostnamen oder ein IP-Muster angeben, zum Beispiel:
Es wird auch eine
--random-start-delay <millis>
Option unterstützt , die den Start des Befehls auf jedem Host um ein zufälliges Zeitintervall zwischen 0 und<millis>
Millisekunden verzögert . Diese Option kann verwendet werden, um donnernde Probleme mit der Herde zu vermeiden, wenn der ausgeführte Befehl auf eine zentrale Ressource zugreift.quelle
Ich habe collectnode entwickelt . Sehr einfach und effektiv, um Aufgaben auf mehreren Servern auszuführen (Fenster eingeschlossen).
So verwenden Sie CollectNode:
Erstellen Sie die Liste der Server, mit denen Sie arbeiten möchten:
Führen Sie CollectNode aus, indem Sie die Liste der Serves übergeben:
Optional können die Ergebnisse gefiltert werden. Dieser Befehl zeigt beispielsweise nur den Server an, auf dem die Bedingung erfüllt ist.
https://collectnode.com/5-tasks-collectnode-can-help-managing-servers/
quelle
Nur ein Headsup für eine wirklich schöne Frage:
Die beste Lösung, die ich gefunden habe, ist, nicht überraschend, tmux.
Sie können Strg-B: Synchronisieren-Fenster in tmux für erstaunliche Ergebnisse setzen. Dazu müssen Sie alle Ihre ssh-Verbindungen in verschiedenen Fenstern von Tmux geöffnet haben.
quelle
Vielleicht funktioniert so etwas, um Befehl auf mehreren Hosts auszuführen? Angenommen, alle Hosts sind in .ssh / config eingerichtet, um sich ohne Kennwort anzumelden.
$ < hosts.txt xargs -I {} ssh {} command
quelle
Erstellen Sie eine Datei / etc / sxx / hosts
bevölkern wie folgt:
Teilen Sie den SSH-Schlüssel auf allen Computern.
Installieren Sie sxx aus dem Paket:
https://github.com/ericcurtin/sxx/releases
Dann führe den Befehl wie folgt aus:
quelle
Verwenden Sie Paramiko http://www.paramiko.org/ und Thread-basierte Parallelität https://docs.python.org/3/library/threading.html. Der folgende Code ermöglicht die parallele Ausführung mehrerer Befehle auf jedem Server!
Hinweis: Wiederholen Sie die obigen Anweisungen für jeden Server.
quelle
Ich denke, "erwarten" ist das, was Sie brauchen.
Viele Menschen wissen nicht einmal, dass es existiert. Es ist ein tcl-basiertes Programm, das Fragen und mögliche Antworten für Sie erstellt. Schauen Sie unter https://wiki.tcl-lang.org/page/Expect nach
quelle