Perl: exécuter en SSH des commandes sur plusieurs serveurs

perl2

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 »!

 

 

 

Be the first to comment

Leave a Reply

Votre adresse de messagerie ne sera pas publiée.


*