Ich habe eine Reihe von Servern in einer Textdatei namens network_list.txt
. Wie kann ich die Server durchlaufen und den Befehl ausführen und das Ergebnis anzeigen? Ich habe folgendes versucht:
filename="network_list.txt"
service=httpd
while read -r line
do
name="$line"
ping -c 3 $name > /dev/null 2>&1;
RETVAL=$?
if [ $RETVAL -ne 0 ]
then
echo "$name is down"
else
echo "$name is up and running"
fi
http_status=$(ssh $name ps -ef | grep -v grep | grep $service | wc -l)
if [ $http_status -ne 0 ]
then
echo "$service is up and running in $name"
else
echo "$service is down in $name"
fi
done < "$filename"
Aber es stoppt nach dem ersten Server.
Vielen Dank :) .
for
Schleife. Jetzt füge ich diese Hostnamen in eine Ansible-Konfigurationsdatei ein und fordere Ansible an, auf jedem von ihnen ein Skript auszuführen. Ansible bietet Ihnen die Möglichkeit, das Skript lokal zu schreiben und zu testen und es dann auf jedem Server remote auszuführen. Die Hälfte der Dinge, die meine Skripte früher erledigt haben, werden von Ansible-Modulen erledigt, daher muss ich viel weniger warten. A + wird niemals zurückkehren.salt \* cmd.run "systemctl is-active httpd"
Antworten:
Sie müssen den Befehl stdin of SSH in Ihrer Schleife nach nirgendwo umleiten, um zu verhindern, dass alle Ihre Zeilen gelesen werden. Dies sollte es tun:
quelle
Es gibt eine Lösung mit
-n -x
Parametern:Das
-x
deaktiviert die X11-Weiterleitung, um möglicheX11 forwarding request failed
Nachrichten zu entfernen.Das
-n
leitet stdin von / dev / null um (verhindert tatsächlich das Lesen von stdin).quelle
Während die Antwort, die akzeptiert wird, völlig funktioniert, möchte ich nur dieses Skript anbieten, das nützlich sein könnte, wenn jemand darauf stößt.
Verwendungszweck
Sie müssten also offensichtlich die Zeilen unter den Zeilen "Echo $ server $ serverIP" ändern, um die tatsächlichen Befehle wiederzugeben, die Sie verwenden möchten. $ 1 ist das erste, was Sie nach "./scriptname.sh" eingeben - z. B. ./scriptname.sh $ 1 $ 2 $ 3 ... - und so funktioniert das:
$ 1 sollte die Datei mit Ihren Hostnamen sein. $ 2 ist der Positionsparameter, den Sie an FunctionC weitergeben (der in diesem Beispielskript immer aufgerufen wird). Mit $ 2 und $ 3 können die anderen Funktionen (A / B) aufgerufen werden. Alternativ können Sie $ 3 und $ 4 am EOF durch "FunctionA" und "FunctionB" ersetzen, wenn Sie sie immer ausführen möchten.
Ich hoffe, dies hilft jemandem. Es war für mich von unschätzbarem Wert , wenn ich Pakete bereitstellte oder Dinge in der gesamten Domäne testete.
Auch OP:
Warum service = httpd setzen? Es kann besser sein, [testing und "service = $ 1" zu verwenden, wobei $ 1 httpd, splunkd oder ein anderer Dienst sein kann. Außerdem sollte die Variable http_status in "service_status" geändert werden, damit das Skript besser dokumentiert wird.
quelle
Warum nicht verwenden
pssh
?https://github.com/lilydjwg/pssh
Es ist ein paralleles SSH-Tool, das Unterstützung für das Abrufen einer Liste von Hosts aus einer Datei integriert hat:
Dann können Sie die Ausgabe nach Belieben analysieren
quelle