PSSH/SSHPASS : Lancer des scripts en parallèle.

Etape n°1 :

Installation, facile avec pip :

$ sudo pip install pssh
Collecting pssh
  Downloading https://files.pythonhosted.org/packages/60/9a/8035af3a7d3d1617ae2c7c174efa4f154e5bf9c24b36b623413b38be8e4a/pssh-2.3.1.tar.gz
Installing collected packages: pssh
  Running setup.py install for pssh ... done
Successfully installed pssh-2.3.1

Etape n°2 :

Utilisation simple, tous les serveurs ont le même login (par exemple pi2base) et le même mot de passe :

$ cat pssh-hosts
192.168.0.80  
192.168.0.70 
192.168.0.71  
192.168.0.72   
192.168.0.73 
192.168.0.74 
$ pssh -h pssh-hosts -l pi2base -A -i "hostnamectl"

On fait donc la commande hostnamectl via le login pi2base, sur tous les serveurs dans le fichier pssh-hosts.
Plus complexe, les utilisateurs sont différents mais les mots de passe sont identiques :
pi2base) et le même mot de passe :

$ cat pssh-hosts
user1@192.168.0.80  
user2@192.168.0.70 
user3@192.168.0.71  
user4@192.168.0.72   
user5@192.168.0.73 
user6@192.168.0.74 
$ pssh -h pssh-hosts  -A -i "hostnamectl"

Encore plus complexe, sans demander les mots de passe :

$ apt-get install sshpass pssh

Ensuite il suffit de faire un script :

$ cat ssh-distant.sh 
#!/bin/bash

serveur[1]=127.0.0.1
login[1]=xxxx
password[1]=zzzz
serveur[2]=192.168.0.70
login[2]=xxxx
password[2]=zzzz
serveur[3]=192.168.0.71
login[3]=xxxx
password[3]=zzzz
serveur[4]=192.168.0.72
login[4]=xxxx
password[4]=zzzz
serveur[5]=192.168.0.73
login[5]=xxxx
password[5]=zzzz
serveur[6]=192.168.0.74
login[6]=xxxx            
password[6]=zzzz

for index in 1 2 3 4 5 6
do
	printf " cnx sur ${login[index]} \n"
	output=$(sshpass -p ${password[index]} ssh -o StrictHostKeyChecking=no ${login[index]}@${serveur[index]} ' hostnamectl ' 2>&1)
	#echo "$?" 
	echo $output
done

history -c

La commande finale, permet de supprimer l’historique … sinon le mot de passe est en clair dans l’historique.
Par exemple :

$ ./ssh-distant.sh 
 cnx sur xxxxx 
Static hostname: osmc Icon name: computer Machine ID: 1671b5b617884fdf85a465a5ac731b8f Boot ID: a312213621b54c2f953202f480a070d7 Operating System: Open Source Media Center Kernel: Linux 4.14.34-6-osmc Architecture: arm
 cnx sur xxxxx 
Static hostname: raspberrypi Icon name: computer Machine ID: 0b646f6436cf4076bc65ccf9a7517e6c Boot ID: dc978e5c9f4d41a5b4b126b2dd7e923f Operating System: Raspbian GNU/Linux 9 (stretch) Kernel: Linux 4.14.50+ Architecture: arm
 cnx sur xxxxx 
Static hostname: RASP3 Icon name: computer Machine ID: 5c7798e1c4144782bfc8e591138cce5f Boot ID: 7cd79bf1fa26484d8ff98b2cba06726c Operating System: Raspbian GNU/Linux 9 (stretch) Kernel: Linux 4.14.71-v7+ Architecture: arm
 cnx sur xxxxx 
Static hostname: RASP4 Icon name: computer Machine ID: b48f53ca95ae44f8bfc503090332c390 Boot ID: c66f163ff98e4d62b0f855b07a86e0ec Operating System: Raspbian GNU/Linux 9 (stretch) Kernel: Linux 4.14.50-v7+ Architecture: arm
 cnx sur xxxxx 
Static hostname: RASP5 Icon name: computer Machine ID: 45ed4ac581ef4f3fb099a4c8791a4787 Boot ID: e46e4361b8e44dae9f47b812525983ba Operating System: Raspbian GNU/Linux 9 (stretch) Kernel: Linux 4.14.50-v7+ Architecture: arm
 cnx sur xxxxx 
Static hostname: RASP6 Icon name: computer Machine ID: 072b46046e3a4cdea183a0f7d018a2a3 Boot ID: 0143eb44792f457dbe288e4bbd67a973 Operating System: Raspbian GNU/Linux 9 (stretch) Kernel: Linux 4.14.70-v7+ Architecture: arm

Sinon il reste Ansible, mais c’est beaucoup plus lourd :

$ sudo pip install ansible

… mais aussi plus performant. Il suffit de copier le fichier des hosts (pssh-hosts dans mon exemple) dans /etc/ansible/hosts . Sachant qu’il faut faire une clef : ssh-keygen, et ensuite il faut copier la clef : ssh-copy-id -i ~/.ssh/id_rsa.pub root@ip-host .

Le problème de ansible, c’est que sur Raspbian par défaut on a une erreur d’installation :

$ sudo pip install ansible
...
arm-linux-gnueabihf-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -fdebug-prefix-map=/build/python2.7-ttpzh8/python2.7-2.7.13=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -DUSE__THREAD -DHAVE_SYNC_SYNCHRONIZE -I/usr/include/ffi -I/usr/include/libffi -I/usr/include/python2.7 -c c/_cffi_backend.c -o build/temp.linux-armv7l-2.7/c/_cffi_backend.o
      c/_cffi_backend.c:15:17: fatal error: ffi.h: Aucun fichier ou dossier de ce type
       #include 
                       ^
      compilation terminated.
      error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
  
      ----------------------------------------
  Command "/usr/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-JTBUnP/cffi/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-6maTdm/install-record.txt --single-version-externally-managed --prefix /tmp/pip-build-env-JcZXMj --compile" failed with error code 1 in /tmp/pip-install-JTBUnP/cffi/
  
  ----------------------------------------
Command "/usr/bin/python -m pip install --ignore-installed --no-user --prefix /tmp/pip-build-env-JcZXMj --no-warn-script-location --no-binary :none: --only-binary :none: -i https://pypi.org/simple -- setuptools wheel "cffi>=1.4.1; python_implementation != 'PyPy'"" failed with error code 1 in None

A suivre.

Laisser un commentaire

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

Time limit is exhausted. Please reload CAPTCHA.