Blog

Présentation de DSH ou comment lancer plusieurs commande simultanées via SSH

Écrit le 25 01 2017 par Kévin MET _

Cela faisait longtemps que je voulais écrire un billet au sujet de ce petit outil, cela faisait environ 4 ans pour être exact ! Oui, car j’ai découvert DSH dans mon ancien boulot et je l’ai directement adopté car il est super pratique. Il permet de lancer plusieurs shell SSH simultanément ou en série, de récupérer le retour de la commande, bref, il est très pratique quand on gère un tas de serveurs similaires et qu’on a des modifications à faire sur chacun d’entre eux.

Alors oui je sais ce que vous allez me dire : « Mais t’es ringard mec, maintenant on a du puppet, du ansible et consorts pour faire ça proprement ! » ce à quoi je vous rétorquerai : « Oui mais quand tu veux faire un sed en speed sur un fichier de conf qui n’est pas déjà dans une recette et ben ça va beaucoup plus vite ». Voilà, j’espère que ce dialogue fictif de haut vol vous aura convaincu...

Et si jamais ce n’est pas le cas je peux vous dire que j’utilise ansible de manière intensive et que malgré tout, ce petit outil me sert assez régulièrement. Comme je vous le disais, il peut être pratique pour faire un sed mais il peut également servir à faire un grep sur les fichiers de logs de plusieurs frontaux en une seule commande. Résultat que vous vous empresserez de piper avec des awk, sort, sed et autres joyeusetés pour avoir la statistique demandée par le service marketing en une seule commande. Bref, les possibilités sont infinies. Alors, toujours pas convaincu ?

Après ce plaidoyer pour l’utilisation de DSH on va enfin rentrer dans le vif du sujet et voir comment il fonctionne concrètement. Déjà il est disponible sur toutes les distributions donc son installation via le gestionnaire de paquet est basique. Ensuite, il faut savoir qu’il peut fonctionner avec une liste de serveurs ou des groupes contenant des listes de serveurs. La liste de base se trouve dans le fichier :


/etc/dsh/machines.list

Il faut simplement lister les serveurs qu’on veut atteindre dans ce fichier. Dans la suite on va partir sur un exemple concret de 3 serveurs et on va analyser les options au fur et à mesure. Voici le contenu de mon fichier :


root@sup1.mnt-tech.fr:~ # cat /etc/dsh/machines.list 
sup1.mnt-tech.fr
web2.mnt-tech.fr
web3.mnt-tech.fr

Pour commencer on va utiliser la commande "cat /proc/loadavg" et l’option -a qui permet de lancer la commande sur tous les serveurs du fichier /etc/dsh/machines.list


root@sup1.mnt-tech.fr:~ # dsh -a "cat /proc/loadavg"
0.31 0.14 0.14 1/178 6289
0.05 0.03 0.05 1/205 32275
0.04 0.05 0.05 1/189 26773

Par défaut DSH se connecte en série, c’est à dire qu’il attend d’avoir fini sur un serveur pour se connecter à un autre. Selon la situation, on peut avoir besoin de ce comportement ou non. Si l’on désire s’en passer il faut utiliser l’option -c qui va autoriser les connexions concurrentes. Les réponses apparaissent donc dans l’ordre ou elles arrivent. Exemple :


root@sup1.mnt-tech.fr:~ # dsh -a -c "cat /proc/loadavg"
0.31 0.16 0.15 2/169 9285
0.10 0.04 0.05 1/210 1339
0.00 0.03 0.05 1/190 28148

Mais on ne sait pas quel serveur répond quoi me direz vous ? Et vous avez raison, c’est pour ça qu’il existe l’option -M.


root@sup1.mnt-tech.fr:~ # dsh -a -c -M "cat /proc/loadavg"
sup1.mnt-tech.fr: 0.10 0.12 0.13 2/182 10271
web2.mnt-tech.fr: 0.08 0.06 0.06 1/210 2281
web3.mnt-tech.fr: 0.00 0.02 0.05 1/190 28611

Voilà, on y voit beaucoup plus clair maintenant ! Si on veut un peu de verbosité, on peut utiliser l’option -v mais je ne lui ai jamais trouvé la moindre utilité et si on veut être tranquille, on peut utiliser l’option -q.

Maintenant on va voir comment utiliser les groupes et vous allez voir que c’est assez simple. Il suffit de créer un fichier du nom de notre groupe dans le dossier /etc/dsh/group et contenant la liste des serveurs du groupe. Imaginons que je veuille faire un groupe web avec les serveurs utilisés précédemment :


root@sup1.mnt-tech.fr:~ # cat /etc/dsh/group/web
web2.mnt-tech.fr
web3.mnt-tech.fr

Et pour utiliser ce groupe il suffit d’utiliser l’option -g suivie du nom du groupe :


root@sup1.mnt-tech.fr:~ # dsh -g web "cat /proc/loadavg"
0.00 0.01 0.05 1/205 6200
0.01 0.03 0.05 1/189 32228

Voilà, on a fait le tour des options les plus utiles et on va finir par une petite astuce qui permet d’inclure des doubles guillemets à l’intérieur de doubles guillemets dans votre commande :


root@sup1.mnt-tech.fr:~ # dsh -M -g web " echo "\""plop"\"" "
web2.mnt-tech.fr: plop
web3.mnt-tech.fr: plop

Dans le cas présent ça ne sert à rien mais cela m’a déjà servi plusieurs fois, je n’arrive juste plus à remettre la main sur un exemple concret... Si vous en avez en tête n’hésitez pas à me l’indiquer en commentaire.

♥ Partage sur tes réseaux sociaux ♥
Kévin MET
Kévin MET

Auteur de ce blog et gérant de la société MNT-TECH, je publie sur ce blog lorsque le temps me le permet et lorsqu'un sujet qui me parait intéressant n'a pas encore été abordé en français. Toutes les informations techniques présentes sur cette page peuvent être réutilisées moyennant le fait de citer la source.