rsr – run script remote

Nicht selten stehe ich vor der Aufgabe Informationen von mehreren Servern zu sammeln oder “schnell mal” kleine Konfigurationsänderungen durchzuführen. Wenn die Anzahl der Systeme, die man betreut in die hunderte geht, artet das recht schnell in stumpfsinnige Arbeit aus.

Vor langer Zeit habe ich mir ein kleines Tool namens rsr gestrickt, das ich vor kurzem mit weiteren Features (inspiriert von mussh) erweitert habe. Nun möchte ich es auch anderen zur Verfügung stellen und hoffe natürlich auf bugfixes und Verbesserungsvorschläge. ;)
Es gibt zwar auch andere parallel ssh Tools, aber die haben mich nie wirklich glücklich gemacht. Immer hat etwas gefehlt.

Das kann rsr

  • Skript oder einzelne Kommandos auf einer Liste von Hosts ausführen
  • Parallelität der Bearbeitung einstallbar (bis hin zu alle gleichzeitig)
  • Sortierte Ausgaben der entfernten Hosts anzeigen und/oder speichern sowie autoamtisches ausräumen
  • Zusammenfassung aufgetretener Fehler
  • Short- und Option mode
  • SSH Optionen als defaults mitgeben

Ein Beispiel


pinky:/tmp/rsr # cat myhosts.txt
brain
snowball
billie
pharfignewton
pinky:/tmp/rsr # cat myscript.sh
#!/bin/sh
grep acl /etc/fstab
pinky:/tmp/rsr # rsr myscript.sh myhosts.txt
brain: /dev/system/root     /           ext3      acl               1 1
brain: LABEL=boot           /boot       ext2      acl,user_xattr    1 2
snowball: /dev/system/tmp     /tmp        ext3      acl              1 2
snowball: LABEL=boot          /boot       ext3      acl,user_xattr   1 2
billie: /dev/system/root     /           ext3      acl               1 1
billie: LABEL=boot           /boot       ext2      acl,user_xattr    1 2
billie: /dev/system/tmp      /tmp        ext3      acl               1 2
billie: /dev/system/usr      /usr        ext3      acl               1 2
billie: /dev/system/var      /var        ext3      acl               1 2

Errors occured on hosts:
pharfignewton.error_255:ssh: Could not resolve hostname pharfignewton: Name or service not known
pinky:/tmp/rsr #

In diesem Beispiel möchte ich einfach prüfen welche Server acls in der fstab enthalten (OK, ich gebs zu, reichlich sinnlos). Bei Host “pharfignewton” ist ein Fehler aufgetreten, was am Ende des Laufes ausgegeben wird.
Alle anderen Ausgaben die das Skript auf den entfernten Servern erzeugt, werden auf der Console sortiert ausgegeben.

Hier habe ich den “short mode”, in dem nur der Skriptname und optional die Serverlistendatei angeben werden muss verwendet. Möchte man rsr nicht mit den default Werten ausführen versteht es auch im “Option mode” eine Menge Parameter.

Die wichtigsten Paramenter

-C <script>: Skript, das ausgeführt werden soll.
-c <command>: einzelnes Kommando für den remote Host (kann mehrfach angegeben werden).
-H <hostlistfile>: Hostliste.
-h <hostname>: einzelner host (kann mehrfach angegeben werden).
-m [n]: Anzahl der parallelen SSH Sitzungen. Wird [n] nicht angegeben werden alle Hosts gleichzeitig bearbeitet.
-k [n]: Die Ausgaben werden in einem Verzeichnis, sortiert in “Host”-Ausgabedateien gespeichert. [n] gibt an, wieviele Läufe aufbewahrt werden. Wird für [n] nichts angegeben, werden Ausgaben älterer Läufe nicht gelöscht.

Hier die ganze Usage

Usage:
   rsr [OPTIONS]  [-c cmd] [-C scriptfile]
   rsr <script> [<hostfile>]
            Short mode: run <script> on <hostfile> hosts.
            If <hostfile> not given use file "allhosts.txt".
   rsr --help
            for full help text

Send a command or a script to multiple hosts.

OPTIONS:
   --help          This text.
   -m [n]          Run concurrently on 'n' hosts at a time.
                   Use '0' (zero) for infinite. (Default if -m)
                   If option is not set then default is 10
   -i <identity> [identity ..]
                   Load an identity file.  May be used
                   more than once.
   -o <ssh-args>   Args to pass to ssh with -o option.
   -a              Force loading ssh-agent.
   -A              Do NOT load ssh-agent.
   -u              Unique.  Eliminate duplicate hosts. (Default)
   -U              Do NOT make host list unique.
   -P              Do NOT fall back to passwords on any host. This
                   will skip hosts where keys fail.
   -l <login>      Use 'login' when no other is specified with
                   hostname.
   -L <login>      Force use of 'login' name on all hosts.
   -s <shell>      Path to shell on remote host. (Default: bash)
   -t <secs>       Timeout setting for each session.
                   (requires openssh 3.8 or newer)
   -V              Print version info and exit.
OUTPUT ARGS:
   -d [n]          Verbose debug.  Prints each action, all hosts
                   and commands to be executed to STDERR. 'n' can
                   be from 0 to 2.
   -v [n]          Ssh debug levels.  Can be from 0 to 3.
   -q              No output unless necessary.
   -k [n]          Keep last 'n' host output directories (If set
                   without argument then all output dirs kept. If
                   this option is not set no output will be kept)
   -O <dir>        Use <dir> for host output directory
                   with timestamp
PROXY ARGS:
   -p [user@]<host>
                   Host to use as proxy.  (Must have rsr installed)
   -po <ssh-args>  Args to pass to ssh on proxy with -o option.
HOST ARGS:
   -h [user@]<host> [[user@]<host> ..]
                   Add a host to list of hosts.  May be
                   used more than once.
   -H <file> [file ..]
                   Add contents of file(s) to list of hosts.
                   Files should have one host per line.  Use
                   "#" for comments.
COMMAND ARGS:
If neither is specified, commands will be read from standard input.
   -c <command>    Add a command or quoted list of commands and
                   args to list of commands to be executed on
                   each host.  May be used more than once.
   -C <file> [file ..]
                   Add file contents to list of commands to be
                   executed on each host.  May be used more
                   than once.

Download

rsr-2.0.tar.gz
rsr-2.0.tar.gz

Bei Bedarf kann ich auch gerne ein SLES/RHEL RPM schnüren.

Installation

Da rsr lediglich ein Bash Skript ist, kann man es einfach irgendwo, am Besten aber in den $PATH legen.
Achtung: Wird die -O Option nicht angegeben wird temporär ein Arbeitsverzeichnis im aktuellen Pfad angelegt. Man muss daher im aktuellen Verzeichnis Schreibrechte besitzen.

Tipps:

Sinnvoll wäre der ssh-agent, das Verteilen seines public keys und das Füllen der SSH known_hosts mit den Fingerprints aller Server. Wenn einem die Sicherheit und Fingerprints egal ist, kann auch eine entsprechende SSH Optionen für das Nichtbeachten der Fingerprints in den Defaults (im Skript) eingetragen werden. Anderfalls gibts viele, viele Fehlermeldungen!

Ich würde mich freuen, wenn rsr auch anderen Admins so viel Zeit und Stumpfsinnarbeit erspahren würde wie uns…

Vorschläge und Bugfixes gerne an mich!

3 Responses to rsr – run script remote

  1. Ralf

    Hallo Sascha,

    bisher habe ich pdsh für solche Aufgaben verwendet. Dort ist die Pflege der einzelnen Hosts zwar auch über eine Konfigurationsdatei möglich, allerdings müssen sie komma-getrennt in einer Zeile notiert werden. Das Hinzufügen eines weiteren Hosts wird da schnell zur Qual.
    Da ist dein Ansatz deutlich übersichtlicher.

    Danke
    Ralf

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>