Wie kann ich aus einem Shell-Skript ausgewählte Befehle auf mehreren Servern ausführen?

Wie kann ich aus einem Shell-Skript ausgewählte Befehle auf mehreren Servern ausführen?

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 evalauf jedem Server korrekt ausgeführt werden kann.

Hier ist mein gesamtes Skript bisher. Im Wesentlichen möchte ich mich bei jedem Server anmelden $server_arrayund 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

Kapistran,mssh, Undclustershsind alles Tools, die behaupten, Befehle an mehrere Server gleichzeitig zu senden. Wie Sie festgestellt haben, ist dies eine so komplexe Aufgabe, dass es wahrscheinlich besser ist, das Rad nicht neu zu erfinden.

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.

Puppet Bolt Info/Download

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:

  1. Erstellen Sie eine Liste aller Server, auf denen die Befehle ausgeführt werden sollen.
  2. 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.

verwandte Informationen