Table of Contents

PDSH

PDSH est un utilitaire qui permet d'envoyer la même ligne de commande sur plusieurs machines en parallèle. Très utile pour administrer un parc de serveurs Linux.

Installation du paquet centOS 7 :

rpm -ivh pdsh-2.31-1.el7.x86_64.rpm \
         pdsh-rcmd-rsh-2.31-1.el7.x86_64.rpm \
         pdsh-rcmd-ssh-2.31-1.el7.x86_64.rpm

TL;DR

Lancer la commande uname -a via SSH sur serveur1 et serveur2 sous l'utilisateur “user”

pdsh -R ssh -l user -w serveur1,serveur2 uname -a

Définir les machines cibles

Liste en CLI

Utiliser l'option -w <LISTE> (séparer les machines par des virgules, sans espaces) ; il y a plusieurs notations possibles, toutes équivalentes mais avec des styles différents :

pdsh -w serveur1,serveur2,serveur3 uname -a
pdsh -w serveur[1,2,3] uname -a
pdsh -w serveur[1-3] uname -a

On peut même alterner les intervalles : serveur[1-3,5-10].

Via un fichier

Il suffit de créer un fichier contenant une liste des machines cibles, une par ligne, puis de l'appeler avec l'option -w ^<fichier> :

echo -e "serveur1\nserveur2" > serveurs.list
pdsh -w ^serveurs.list uname -a

Comme pour les machines, on peut spécifier plusieurs fichiers : -w ^serveurs.list,^autres.txt.

Pour définir un fichier de machines par défaut, il faut fixer la variable d'environnement WCOLL :

export WCOLL=/tmp/serveurs.list

Expression régulière

On peut définir une liste de machine par expression régulière ; pour cela il faut préfixer la regex par un /. Exemple :

pdsh -w /serveur0*/ serveurs.list uname -a

Variables d'environnement

Pour définir les paramètres ci-dessus comme options par défaut (et raccourcir grandement notre ligne de commande !), on peut utiliser les variables d'environnement suivantes (à exporter ou ajouter dans un .bashrc) :

Exclusion

Pour exclure une machine (ou un fichier de machine), on utiliser le paramètre -x <machine> ou on les préfixe d'un - suivant un -w.

# lancer la commande sur toutes les machines listées dans serveurs.list
# SAUF sur serveur2 (qui est sensé être dedans)
pdsh -w ^serveurs.list -x serveur2 uname -a
 
# équivaut à :
pdsh -w ^serveurs.list,-serveur2 uname -a

Commandes imbriquées

Pour envoyer des commandes imbriquées à traiter sur les machines distantes, on encadre les commandes de quotes (comme en SSH en fait) :

pdsh 'uname -a | grep Linux'

Sans cela, le grep aurait été local.

Lister les modules installés

pdsh -V
 pdsh-2.31 (+readline+debug)
 rcmd modules: ssh,rsh,exec (default: rsh)
 misc modules: (none)

Attention particulière

Pour les commandes retournant plus d'une ligne, les résultats seront mélangés et on ne pourra pas savoir de quelle machine provient le résultat affiché. En effet PDSH multiplexe les commandes et affiche les résultats dans l'ordre ou il les reçoit ; il affichera le nom de la machine distante pour la première ligne mais pas les suivantes qui seront mélangées.