Immer mal wieder kommt es vor, dass man auf mehreren Systemen eine Kleinigkeit ändern muss. So zum Beispiel den Besitzer eines Scriptes oder ähnliches. Bei 5 oder 6 Servern ist dieses noch schnell gemacht, ab einer gewissen Menge wird es wiederum sehr zeitaufwendig. Selbst Systeme wie Puppet oder Chef sind hier nicht immer hilfreich und für so etwas wie die Änderung des Besitzers einer Datei; schießt man schon etwas mit Kanonen auf Spatzen.

Ich nutze dafür seit einigen Jahren pssh (Parallel ssh). Es ist aus meiner Sicht perfekt für kleinere Bash-Einzeiler, welche auf vielen Systemen ausgeführt werden müssen.

Ich möchte es hier am angesprochenen Beispiel der Besitzänderung eines Scriptes vorstellen. Folgende Aufgaben müssen dabei erledigt werden:

1. Login per SSH auf dem jeweiligen Server.
2. Änderung des Besitzers und der Gruppe des Scriptes: /home/aglp02/del_import_sync.sh.
3. Anhand von ls -ls prüfen ob die Änderung angekommen ist.
4. Logout und wegspeichern der Bash Ausgabe.

pssh setzt dabei funktionsfähiges SSH sowie den ssh-agent voraus. Wer nicht sicher ist ob es arbeitet:

$ ssh-agent && ssh-add

Für die Installation von pssh wird python sowie die setup-tools benötig. Sind diese Da ist die Installation schnell erledigt mit:

$ wget http://www.theether.org/pssh/pssh-1.4.3.tar.gz
$ tar xvzf pssh-1.4.3.tar.gz
$ cd pssh-1.4.3.tar.gz
$ sudo python setup.py install

Ich erstelle mir immer im Home meines Users den Ordner pssh und dort viele Textdateien in welche ich die jeweiligen Server gruppiere. So muss ich nicht mal mehr darüber nachdenken wenn ich ein Kommando auf einer gewissen Gruppe von Server ausführen will (alle Webserver / alle Mailserver / alle Applikationserver / alle Server an einem Standort / usw…).

In meinem Beispiel geht es um alle Applikationserver in Berlin und damit sieht meine Gruppendatei wie folgt aus:

$ cat /home/kernel/pssh/srv.aps.ber.txt 
srv.aps01.ber
srv.aps02.ber
srv.aps03.ber
srv.aps04.ber
srv.aps05.ber
srv.aps06.ber
srv.aps07.ber
srv.aps08.ber
srv.aps09.ber
srv.aps10.ber
srv.aps11.ber
srv.aps12.ber
srv.aps13.ber
srv.aps14.ber
srv.aps15.ber
srv.aps16.ber
srv.aps17.ber
srv.aps18.ber
srv.aps19.ber
srv.aps20.ber
srv.aps21.ber

Damit kann ich auch schon mein Kommando absetzten. Ich erkläre den Aufbau weiter unten.

$ pssh -h srv.aps.ber.txt -l root -o /home/kernel/pssh/out-`date +"%m-%d-%y_%H:%M:%S"` "chown aglp02:aglp02 /home/aglp02/del_import_sync.sh; ls -la /home/aglp02/del_import_sync.sh;"
[1] 10:17:35 [SUCCESS] srv.aps17.ber 22
[2] 10:17:35 [SUCCESS] srv.aps03.ber 22
[3] 10:17:35 [SUCCESS] srv.aps01.ber 22
[4] 10:17:36 [SUCCESS] srv.aps12.ber 22
[5] 10:17:36 [SUCCESS] srv.aps04.ber 22
[6] 10:17:36 [SUCCESS] srv.aps16.ber 22
[7] 10:17:36 [SUCCESS] srv.aps08.ber 22
[8] 10:17:36 [SUCCESS] srv.aps15.ber 22
[9] 10:17:36 [SUCCESS] srv.aps05.ber 22
[10] 10:17:36 [SUCCESS] srv.aps09.ber 22
[11] 10:17:36 [SUCCESS] srv.aps20.ber 22
[12] 10:17:36 [SUCCESS] srv.aps10.ber 22
[13] 10:17:36 [SUCCESS] srv.aps11.ber 22
[14] 10:17:36 [SUCCESS] srv.aps21.ber 22
[15] 10:17:36 [SUCCESS] srv.aps07.ber 22
[16] 10:17:36 [SUCCESS] srv.aps19.ber 22
[17] 10:17:36 [SUCCESS] srv.aps02.ber 22
[18] 10:17:37 [SUCCESS] srv.aps13.ber 22
[19] 10:17:37 [SUCCESS] srv.aps06.ber 22
[20] 10:17:37 [SUCCESS] srv.aps14.ber 22
[21] 10:17:37 [SUCCESS] srv.aps18.ber 22

-h gibt die zu verwendente Datei mit den Hosts an.
-l Benutzername für den Login auf dem Server.
-o Ordner für die Bash-Ausgabe der einzelnen Server. Landet bei mir immer pssh-Ordner. Ich lasse mir dabei gerne einen Unterordner erstellen, welche das aktuelle Datum und die aktuelle Uhrzeit enthält. So kann ich die Ausgaben besser zuordnen.
Das/die auszuführenden Bash-Commands.

Als Antwort erhalte ich dann auf welchem Server dieses Kommando ausgeführt wurde. Dabei sieht man recht schön, dass die Hosts nicht nach der Reihe abgearbeitet werden, sondern gleichzeitig.

Die einzelnen „Logdateien“ der Bash-Ausgaben, von den einzelnen Servern sollten nun wie folgt zu finden sein:

$ ls -la /home/kernel/pssh/out-09-22-14_10:17:35/
insgesamt 40
drwxr-xr-x 2 kernel kernel 4096 22. Sep 10:17 .
drwxr-xr-x 4 kernel kernel 4096 22. Sep 10:17 ..
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps01.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps02.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps03.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps04.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps05.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps06.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps07.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps08.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps09.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps10.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps11.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps12.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps13.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps14.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps15.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps16.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps17.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps18.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps19.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps20.ber
-rw-r--r-- 1 kernel kernel   73 22. Sep 10:17 srv.aps21.ber

Wir dürfen nun also in den einzelnen Files die Antwort auf das ls -la erwarten. Schauen wir mal rein:

$ cat /home/kernel/pssh/out-09-22-14_10:17:35/srv.aps01.ber
-rwxr-xr-x 1 aglp02 aglp02 1801 Jan 21  2009 /home/aglp02/del_import_sync.sh

So lässt sich nun kontrollieren ob alles sauber erledigt wurde oder ob ich noch irgendwo „ran“ muss.

Ist pssh also einmal vorbereitet lässt es sich wunderbar und schnell in seine Arbeit integrieren.

Viel Spaß…