Outils pour utilisateurs

Outils du site


tuto:linux:envoyer_les_memes_commandes_sur_plusieurs_serveurs_ssh

source : http://linux-attitude.fr/post/Le-travail-a-la-chaine-cest-has-been http://linux-attitude.fr/post/Le-travail-a-la-chaine-cest-has-been

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
tuto/linux/envoyer_les_memes_commandes_sur_plusieurs_serveurs_ssh.txt · Dernière modification: 2009/03/15 13:09 (modification externe)