Table des matières
Konsole et dsh, les ancêtres
Pour envoyer une même suite de commandes sur un groupe de machines, on peut soit le faire à l'aveugle avec Konsole (si on supporte KDE), soit lancer ses commandes coûte que coûte avec dsh, mais sans contrôle encore une fois sur le déroulement.
Avec Konsole : préparez dans une même fenêtre une machine à contrôler par onglet, puis dans les menus : View > Send Input to All Sessions. Désormais, tout ce que vous tapez est répété dans toutes les fenêtres.
Avec dsh :
dsh -m machine1 -m machine2 commande
Attention, n'oubliez pas que votre commande est d'abord interprétée par votre shell. Ainsi, comparez :
dsh -m machine1 -m machine2 -m ... "echo $HOSTNAME" dsh -m machine1 -m machine2 -m ... 'echo $HOSTNAME'
clusterssh
Mais si on désire surveiller ce qui se passe sur toutes les machines, et ainsi avoir un contrôle visuel, et au besoin effectuer une correction sur une machine en particulier, alors des outils graphiques rendent bien service, en affichant dans un terminal distinct chacune des machines que l'on contrôle. Par ici pour des captures d'écran, et un petit article de présentation de clusterssh !
Vous pouvez définir vos groupes de machines dans le fichier /etc/clusters :
groupe1 machine1 machine2 machine3 machine4 machine5 machine6 machine7 machine8 machine9 groupe2 machine10 machine11 machine12 machine13 machine14 machine15 all groupe1 groupe2
Dès lors, un
cssh groupe1 # vous ouvre un terminal sur machine1 à machine 9 cssh groupe2 # vous ouvre un terminal sur machine10 à machine15 cssh all # pour machine1 à machine15
Si vous avez des ports particuliers, des utilisateurs particuliers à utiliser sur certaines machines, pensez à votre ~/.ssh/config
Et comme indiqué dans les commentaires, une alternative à clusterssh est clusterm, qui est un peu plus eye-candy et offre en plus la merveilleuse fonctionnalité d'afficher les différences entre les écrans, à la vimdiff, très pratique pour comparer rapidement des fichiers de configuration entre n machines distinctes ! Malheureusement, ce programme n'est pas packagé pour Debian.
Toutefois, des paquets pour ubuntu existent (ils marchent aussi sous debian), il suffit de récupérer les 2 .deb proposés et de les installer à coup de dpkg -i.
Pas de fichier de configuration de groupe pour ce programme, mais plusieurs options :
alias clusterm-groupe1='clusterm machine1 machine2 machine3 machine4 machine5 machine6 machine7 machine8 machine9'
ou bien constituer votre groupe “à la main” dans l'interface, en ouvrant successivement vos shells sur chacune des machines indiquées, puis enregistrer votre session (menu fichier) sous forme d'un raccourci à placer sur votre bureau
pssh
Une autre petite suite d'outils bien sympathique est pssh, qui propose diverses commandes comme parallel-ssh (équivalent de dsh -c), parallel-nuke, parallel-scp ou parallel-slurp (son contraire).
Le plus simple est de lire ce qu'indique la description du paquet (apt-cache show pssh) :
- Parallel ssh (parallel-ssh, upstream calls it pssh), executes commands on multiple hosts in parallel
- Parallel scp (parallel-scp, upstream calls it pscp), copies files to multiple remote hosts in parallel
- Parallel rsync (parallel-rsync, upstream calls it prsync), efficiently copies files to multiple hosts in parallel
- Parallel nuke (parallel-nuke, upstream calls it pnuke), kills processes on multiple remote hosts in parallel
- Parallel slurp (parallel-slurp, upstream calls it pslurp), copies files from multiple remote hosts to a central host in parallel
# Tout d'abord, constituer un fichier groupe1.txt contenant une machine par ligne parallel-ssh groupe1.txt uptime # Récupérer dans des répertoires relatifs au nom des serveurs un fichier donné sur chacun des serveurs mkdir -p /tmp/slurp parallel-slurp -h groupe1.txt -L /tmp/slurp /etc/hostname hostname ls -lR /tmp/slurp # Tuer apache* sur tout un groupe de machines parallel-nuke -h groupe1.txt apache # Pousser un fichier localement sur toutes les machines parallel-scp -h groupe1.txt toto.pl ~/toto.pl
Sinon, pour lancer juste une petite commande sur plusieurs machines et avoir tous les résultats à la suite, voila un tout petit script :
#!/bin/bash # Script to run a command across multiple machines TIMEOUT=10 MACHINES=$1;shift COMMAND=$1;shift for machine in $MACHINES do echo $machine ssh -oConnectTimeout=$TIMEOUT $machine $COMMAND done
Exemple :
$ ./runremote.sh 'machine1 machine2 machine3 machine4' 'uptime' machine1 13:15:59 up 8 days, 3:28, 1 user, load average: 0.00, 0.02, 0.00 machine2 13:10:03 up 153 days, 22:43, 0 users, load average: 0.50, 0.48, 0.45 machine3 13:16:00 up 117 days, 3:02, 9 users, load average: 0.39, 0.41, 0.45 machine4 13:16:00 up 99 days, 3:25, 2 users, load average: 3.55, 4.35, 4.31