Wie kann ich Skripte aus Argumenten auf mehreren Servern ausführen?
Ich versuche, eine Befehlsliste zu erstellen und dann auf jedem Server Befehle auszuführen. Ich kann die Befehlsliste nicht so generieren, dass sie eval
auf jedem Server korrekt ausgeführt werden kann.
Hier ist mein gesamtes Skript bisher. Im Wesentlichen möchte ich mich bei jedem Server anmelden $server_array
und entweder alle Befehle in $script_arr oder nur den ausgewählten Befehl ausführen.
#!/bin/bash
# run-commands.sh [optional script name]
# ex. run-commands.sh
# ex. run-commands.sh date_script
# ex. run-commands.sh hostname_script
# declare -a server_arr=("a.local" "b.local")
declare -a server_arr=("localhost")
if [ $# -eq 0 ]
then
# Default Processes
declare -a script_arr=("date_script" "hostname_script")
else
declare -a script_arr=($1)
fi
build_cmds()
{
script_arr=("${@}")
declare -a cmds
for script_name in "${script_arr[@]}"
do
case "$script_name" in
"date_script")
cmds+='printf "executing date command\n; "'
cmds+='date'
cmds+='printf "date command executed\n; "'
;;
"hostname_script")
cmds+='printf "executing date command\n; "'
cmds+='date'
cmds+='printf "date command executed\n; "'
;;
esac
done
}
build_cmds "${script_arr[@]}"
for cmd in "${cmds[@]}"
do
ssh user@$server_name -T 'eval "$cmd"'
done
echo "Completed executing all commands"
Antwort1
Antwort2
Ich würde das mit Puppet Bolt machen. Damit können Advocacy-Befehle ganz einfach aus der Ferne ausgeführt werden. Laden Sie einfach Puppet Bolt herunter (KOSTENLOS) und verwenden Sie es, um den Befehl an eine bereitgestellte Liste von Hosts auszugeben.
Installieren Sie einfach Bolt und stellen Sie sicher, dass Sie auf allen Hosts SSH-Schlüssel eingerichtet haben
Antwort3
1). Schreiben Sie ein serverseitiges Skript mit allen erforderlichen Befehlen und geben Sie die Umleitung ins Protokoll aus. Beispielsweise „server-side.sh“, das den Servernamen und den freien Speicherplatz auf diesem Server anzeigt:
#! /bin/bash
cat /etc/hostname > log.txt
date > log.txt
df -h > log.txt
2). Schreiben Sie das zweite Skript, das Sie auf der lokalen Arbeitsstation ausführen. Beispielsweise „run-server-side.sh“, das ein Skript an den Server sendet, ausführt und das Ergebnisprotokoll zurückgibt:
#! /bin/bash
SERVERS="server_1 server_2"
for ONE_SERVER in SERVERS
do
scp server-side.sh $ONE_SERVER:path
ssh $ONE_SERVER path/server-side.sh
scp $ONE_SERVER:path/log.txt
mv log.txt "log-$ONE_SERVER.txt"
done
Anmerkungen:Server müssen in konfiguriert sein .ssh/config
, Autorisierung per Schlüssel. Beispiel:
Host server_1
HostName address_1
User user_name_1
Host server_2
HostName address_2
User user_name_2
Vorteile.
- Nur „natives“ und „integriertes“ Bash – ohne zusätzliche Software.
- Jeder Remote-Server verfügt immer über die neueste Version des Skripts.
- Sie können ein relativ komplexes Skript an der lokalen Arbeitsstation in Ihrem bevorzugten Editor schreiben und bearbeiten.
Orte der Entwicklung.
- Große serverseitige Skripte lassen sich bequem in mehrere kleine aufteilen (eine Aufgabe == ein Skript) und diese über hochladen
rsync
. - Für eine schöne Ausgabe in der Konsole können Sie für jeden Server oder jede Aufgabe unterschiedliche Farben verwenden:http://misc.flogisoft.com/bash/tip_colors_and_formatting
Antwort4
Es gibt einige Dinge, die Sie tun können.
Ich weiß nicht, ob Sie es vorziehen, dass die Befehle parallel oder seriell ausgeführt werden.
Wenn Sie die serielle Ausführung bevorzugen, können Sie Folgendes tun:
- Erstellen Sie eine Liste aller Server, auf denen die Befehle ausgeführt werden sollen.
- laufen:
for server in $(cat server.list); do "command1 ; command2 ; command3..."; done
Wenn Sie möchten, dass die Befehle parallel ausgeführt werden, können Sie das Tool parallel-ssh verwenden, das auf beiden Betriebssystemen der CentOS-/Ubuntu-Variante installiert werden kann.
Wenn Sie möchten, habe ich ein Shell-Skript geschrieben, das den Befehl „Parallel-SSH“ umschließt und es dem Benutzer ermöglicht, eine Serverliste und Befehle bereitzustellen. Das Skript gibt die Befehle dann parallel auf allen Servern aus.
Das Skript finden Siein meinem Github.
Eine letzte Sache, die ich anbieten kann, ist die Verwendung von Ansible mit Inventar.