PSSH : Lancement de commande en parallèle par SSH


PSSH, pour Parallel SSH, est une suite d’outils développés en python permettant de lancer une commande sur plusieurs machines en parallèle, d’y copier des fichiers ou de synchroniser des répertoires, le tout intuitivement en ligne de commande.

Il présente l’intérêt de ne pas nécessiter d’interface graphique pour fonctionner, contrairement à d’autres outils tel que « cluster ssh », ce qui le rend facile à scripter.

La suite PSSH inclus les outils parallélisés d’accès aux shell, « pssh » (ou « parallel-ssh »), de copie de fichier, « pscp » (ou « parallel-scp ») et « pslurp » (ou « parallel-slurp »), de synchronisation de répertoires « prsync » (ou « parallel-rsync ») et de kill (« tuage » de processus) « pnuke » (ou « parallel-nuke »).

Note : Les outils sont appelés p »quelque chose » ou parallel-« quelque chose » en fonction des distributions mais le fonctionnement reste le même…

PSSH est téléchargeable sur le site du projet hébergé par freashmeat : http://freshmeat.net/projects/pssh/, ou depuis le site des développeurs : http://www.theether.org/pssh/.

Installation

PSSH est packagé sous de nombreuses distributions Linux mais, ne pose aucune difficulté pour être installée depuis les sources. Récupérez le liens de téléchargement depuis le site du projet puis téléchargez l’outil, l’extraire et lancer le « setup.py » :

mafalda src # pwd
/usr/src
mafalda src # wget -q http://freshmeat.net/urls/75855f14446a19729a4e51ea428bd43b
mafalda src # ls -lh pssh*
-rw-r--r-- 1 root root 37K 2008-10-12 13:48 pssh-1.4.3.tar.gz
mafalda src # tar xf pssh-1.4.3.tar.gz 
mafalda src # cd pssh-1.4.3
mafalda pssh-1.4.3 # python setup.py install
running install
...
Installed /usr/lib64/python2.6/site-packages/pssh-1.4.3-py2.6.egg
Processing dependencies for pssh==1.4.3
Finished processing dependencies for pssh==1.4.3
mafalda pssh-1.4.3 #

Note : Pour le moment, il n’existe pas d' »uninstall » sur pssh. Un rapide coup d’œil à l’installation donne la liste des fichiers à supprimer pour désinstaller la suite d’outils de l’application :

mafalda pssh-1.4.3 # python setup.py install | grep " /"
Removing /usr/lib64/python2.6/site-packages/pssh-1.4.3-py2.6.egg
Copying pssh-1.4.3-py2.6.egg to /usr/lib64/python2.6/site-packages
Installing prsync script to /usr/bin
Installing pnuke script to /usr/bin
Installing pslurp script to /usr/bin
Installing pscp script to /usr/bin
Installing pssh script to /usr/bin
Installed /usr/lib64/python2.6/site-packages/pssh-1.4.3-py2.6.egg
mafalda pssh-1.4.3 # rm /usr/lib64/python2.6/site-packages/pssh-1.4.3-py2.6.egg \
> /usr/bin/{prsync,pnuke,pslurp,pscp,pssh}

Utilisation

Pour utiliser les outils de « parallèle ssh », les comptes doivent disposer d’une authentification par clé publique/privée ssh sans mot de passe. Un rappel succins de la mise en place de ce mode d’accès est rappelé dans le post « Restriction des commandes SSH sur clés publique /privée » sur Admin Linux.

Bases

Toutes les commandes de « parallèle ssh » fonctionnent sur le même mode de construction :

commande_pssh -h fichier [options]

où « fichier » est un fichier texte listant les machines sur lesquelles la commande doit être appliquée à raison d’une machine par ligne :

machine1:port_ssh utilisateur
machine2
machineN utilisateur

avec « :port_ssh » et « utilisateur » des paramètres optionnels.

Note : Par défaut le retour d’une commande passée par « pssh » n’est pas affichée sur la sortie standard. L’option « -P » permet d’afficher le résultat sur la console standard.

Dans les exemples suivants nous utiliserons le fichier de définition des machines nommé « srvs.pssh » suivant :

srv:222 fhh
backup admin
mafalda

Exemples d’utilisation

pssh

Qui lance la commande sur les machines ?

fhh@mafalda ~ $  pssh -h srvs.pssh -P whoami
srv: fhh
srv: [1] 18:47:59 [SUCCESS] srv 222
backup: admin
backup: [2] 18:47:59 [SUCCESS] backup 22
mafalda: fhh
mafalda: [2] 18:47:59 [SUCCESS] mafalda 22

L’utilisateur « fhh » lance la commande sur « srv » comme spécifié dans le fichier « srvs.pssh ».
« fhh » Étant l’utilisateur lançant la commande, c’est aussi lui qui l’exécute sur mafalda car aucun utilisateur n’a été spécifié dans le fichier de configuration.
La commande est enfin exécutée en tant que admin sur « backup » comme indiqué dans « srvs.pssh ».

Pensez à bien configurer votre fichier « ~/.ssh/config » afin d’utiliser les clé d’authentification pertinentes pour chaque machine et/ou compte.

Sans l’option « -P », aucun écho du retour de la commande n’aurai été affiché :

fhh@mafalda ~ $  pssh -h srvs.pssh uptime
[1] 19:01:09 [SUCCESS] mafalda 22
[2] 19:01:09 [SUCCESS] srv 222
[3] 19:01:09 [SUCCESS] backup 22
fhh@mafalda ~ $  pssh -h srvs.pssh -P uptime
backup:  19:07:35 up 248 days,  8:29,  0 users,  load average: 0.06, 0.06, 0.01
backup: [1] 19:01:19 [SUCCESS] backup 22
srv:  19:07:35 up 128 days,  4:46,  0 users,  load average: 0.00, 0.00, 0.00
srv: [2] 19:01:20 [SUCCESS] srv 222
mafalda:  19:02:17 up 40 days,  4:12,  0 users,  load average: 0.00, 0.00, 0.00
mafalda: [3] 19:01:20 [SUCCESS] mafalda 22

Il est également possible de définir un répertoire de destination des retours de commandes avec l’option « -o ». Dans ce cas un fichier sera créé par machine contenant le retour de la commande lancée.

L’option « -t » ou « –timeout » donne la durée maximale d’exécution d’une commande (fixée par défaut à 60 secondes).

pscp, pslurp

« pscp » est destiné à la copie de fichier en parallèle sur vos machines :

fhh@mafalda ~ $ mkdir -p tmp/test/pssh
fhh@mafalda ~ $ for i in {1..10} ; do touch tmp/test/pssh/fic.$i ; done
fhh@mafalda ~ $ ls tmp/test/pssh/
fic.1  fic.10  fic.2  fic.3  fic.4  fic.5  fic.6  fic.7  fic.8  fic.9
fhh@mafalda ~ $ pscp -h srvs.pssh -r tmp/test/pssh /tmp/
[1] 19:19:21 [SUCCESS] srv 222
[2] 19:19:21 [SUCCESS] backup 22
[3] 19:19:21 [SUCCESS] mafalda 22
fhh@mafalda ~ $ pssh -h srvs.pssh -P ls /tmp/pssh
srv: fic.1
fic.10
...
fic.9
srv: [1] 19:20:19 [SUCCESS] srv 222
backup: fic.1
fic.10
...
fic.9
backup: [2] 19:20:19 [SUCCESS] backup 22
mafalda: fic.1
fic.10
...
fic.9
mafalda: [3] 19:20:19 [SUCCESS] mafalda 22
fhh@mafalda ~ $

tandis que « pslurp » permet de rapatrier les fichiers de différentes machines vers la machine locale :

fhh@mafalda ~ $ pslurp -h srvs.pssh -r -L tmp/test/pssh/incomming/ /tmp/pssh pssh
[1] 19:25:17 [SUCCESS] srv 222
[2] 19:25:17 [SUCCESS] mafalda 22
[3] 19:25:17 [SUCCESS] backup 22
fhh@mafalda ~ $ tree tmp/test/pssh/incomming/
tmp/test/pssh/incomming/
|-- mafalda
|   `-- pssh
|       |-- fic.1
...
|       `-- fic.9
|-- backup
|   `-- pssh
|       |-- fic.1
...
|       `-- fic.9
`-- srv
    `-- pssh
        |-- fic.1
...
        `-- fic.9
 
6 directories, 30 files

Où « -r » implique la récursivité, « -L répertoire » est le répertoire de destination, « /tmp/pssh » est le répertoire à rapatrier et « pssh » est le nom du répertoire cible créé sous le répertoire portant le nom de la machine depuis laquelle les fichiers sont importés.

Cette commande peut être utilisée pour sauvegarder les fichiers de configuration de vos serveurs par exemple :

fhh@mafalda ~ $ pslurp -h srvs.pssh -r -L /exports/sauvegardes/config /etc etc

prsync

« prsync » est également destiné à la copie de fichier en parallèle d’une machine vers plusieurs autres comme « pscp » mais présente l’intérêt d’ajouter quelques options de « rsync » tel que la copie en mode archive ou la compression de donnée.

fhh@mafalda ~ $ prsync -h srvs.pssh -a -r tmp/test/pssh /tmp/

Voir le man de rsync pour plus de détails sur ces options.

pnuke

Dernier outils de la suite « Parallèle SSH », « pnuke » permet de tuer un processus sur une série de machine en une seule ligne de commande :

fhh@mafalda ~ $ pnuke -h srvs.pssh fcron
[1] 18:07:42 [SUCCESS] backup 22
[2] 18:07:42 [SUCCESS] srv 222
[3] 18:07:42 [SUCCESS] mafalda 22

Naturellement, ce n’est que pour l’exemple… pensez à redémarrer « fcron » sur vos machines :

fhh@mafalda ~ $ pssh -h srvs.pssh -P /etc/init.d/fcron restart
...

Références

Le site de de PSSH : http://www.theether.org/pssh/
et PSSH sur Freshmeat : http://freshmeat.net/projects/pssh/

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *