Objectif: Exécuter via ssh une commande sur plusieurs serveurs et obtenir directement les résultats. Pour l’exemple on demandera à récupérer les adresses IP.
Prérequis :
Le module Net::OpenSSH doit être installé. En général il est présent dans le dépôt de la distrib Linux.
Sur le pc qui exécute le script:
sudo apt-get install libnet-openssh-perl
Créer les accès clés ssh + edition du fichier hosts. Au besoin revoir ce tuto qui rappelle les principes et les manip précises.
ssh-keygen -t rsa
ssh-copy-id user@serveur1
ssh-copy-id user@serveur2
etc…
Edition du fichier /etc/hosts pour rajouter la correspondance nom/IP de nos serveurs.
exemple :
192.168.0.22 serveur1 192.168.0.23 serveur2
Edition du script
Création du fichier qu’on nommera: ssh.pl
vim ssh.pl
Code du script perl à copier sans ssh.pl:
1#!/usr/bin/perl
2# déclaration des pragmas et du module
3 use strict; use warnings;
4 use Net::OpenSSH;
5 #variables
6 my $user="pi"; #compte utilisateur qui existe sur serveur
7 my $host;
8 my $port=22; # à modifier si vs utiliser un autre port en ecoute sur ssh
9 # mettre les noms des serveurs dans /etc/hosts
10 my @servers=('serveur1','serveur2');
11 # On parcourt la liste des serveurs
12 foreach $host(@servers){
13 my $ssh=Net::OpenSSH->new("$user\@$host",timeout=>30);
14 $ssh->error and die "unable blablabla". $ssh->error;
15 print "Connected to $host\n";
16 my $fh = $ssh->pipe_out('ip a s |grep eth0 | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"'') or die "unable to run command\n";
17 #my $fh = $ssh->pipe_out('uname -r') or die "unable to run command\n";
18 while (<$fh>){
19 print "$host: $_";
20 }
21 }
Ne pas oublier d’attribuer au script les droits d’exécution:
chmod u+x ssh.pl
Précisions
Le script retourne les adresses ip de chaque serveur en une seule ligne de commande. C’est pas forcément utile mais cela montre tout de même son efficacité. Vous pouvez « décommenter » la Ligne 17 en supprimant le « # » en début deligne et rajouter un « # » à la ligne 16:
my $fh = $ssh->pipe_out('uname -r') or die "unable to run command\n";
cette commande retourne la version du kernel de votre noyau linux. Imaginez que vous vouliez connaitre la version d’une 10 zaine de serveurs. Et bien avec ce script c’est « one shot »!
Leave a Reply