2017-10-17 4 views
2

J'ai un script Perl dans lequel je veux d'abord vérifier s'il est possible de ssh dans le serveur avant de réellement faire ssh. Donc, si c'est possible de ssh, alors allez-y et ssh dans ce serveur, sinon gérer cette exception de manière appropriée.Perl script pour vérifier si possible de ssh dans le serveur distant

J'ai donc ce script qui passe par un fichier texte avec une liste des bases de données, et essaie de ssh sur chaque serveur pour effectuer une commande bash qui vérifie si le serveur exécute MySQL SST ou non:

#!/usr/bin/perl -w 

use strict; 
use warnings; 

use 5.010; 
use DBI; 
use Encode; 
use IO::File; 
use JSON; 
use utf8; 

BEGIN { 
    binmode STDERR, ':utf8'; 
    binmode STDIN, ':utf8'; 
    binmode STDOUT, ':utf8'; 
} 

my $time = localtime(); 
my $file = '/opt/db-servers/db.txt'; 
open my $info, $file or die "Could not open $file: $!"; 

while(my $hostname = <$info>) { 
    chomp($hostname); 
    my $xtrabk_check = `ssh $hostname ps -ef |grep mysql | grep wsrep_sst_xtrabackup-v2`; 
    my $role_check = `ssh $hostname ps -ef |grep mysql | grep donor`; 
    my $error_log = `ssh $hostname ps -ef |grep mysql`; 
     if ($xtrabk_check ne ""){ 
      if ($role_check ne ""){ 
       my $cmd ="curl -vs -o /dev/null -X POST --data-urlencode 'payload={\"channel\": \"#db-wsrep-status-log\", \"username\": \"db-wsrep-status-log\", \"text\": \"$time: $hostname: --role Donor \n```$error_log```\", \"icon_emoji\": \":scorpion:\"}' 2>&1 /dev/null https://hooks.slack.com/services/GVadasdd/B6LSMF5GV/BIApnzoIldfdsrw343wf"; 
       system($cmd); 
      } 
      else { 
       my $cmd ="curl -vs -o /dev/null -X POST --data-urlencode 'payload={\"channel\": \"#db-wsrep-status-log\", \"username\": \"db-wsrep-status-log\", \"text\": \"$time: $hostname: State transfer in progress, setting sleep higher mysqld \n```$error_log```\", \"icon_emoji\": \":scorpion:\"}' 2>&1 https://hooks.slack.com/services/GVadasdd/B6LSMF5GV/BIApnzoIldfdsrw343wf"; 
       system($cmd); 
      } 
     } 
} 
close $info; 

donc probablement avant d'effectuer les trois lignes ci-dessous, je veux être en mesure de savoir si ce serveur est en panne (ne peut donc pas le client ssh) ou non (ssh puis dans avec les commandes ci-dessous):

my $xtrabk_check = `ssh $hostname ps -ef |grep mysql | grep wsrep_sst_xtrabackup-v2`; 
    my $role_check = `ssh $hostname ps -ef |grep mysql | grep donor`; 
    my $error_log = `ssh $hostname ps -ef |grep mysql`; 

Comment puis-je y arriver? D'ailleurs, l'URL floue a été modifiée, donc la sécurité inquiète.

Répondre

1

La méthode la plus fiable pour déterminer si vous pouvez utiliser ssh sur un serveur est de loin la tentative la plus fiable d'y entrer. Il suffit de tenter de se connecter et, si elle échoue, signaler l'échec et abandonner toute nouvelle tentative:

use Try::Tiny; 

# Declaring them here so they don't disappear at the end of the try block 
my ($xtrabk_check, $role_check, $error_log); 
try { 
    $xtrabk_check = `ssh $hostname ps -ef |grep mysql | grep wsrep_sst_xtrabackup-v2`; 
    $role_check = `ssh $hostname ps -ef |grep mysql | grep donor`; 
    $error_log = `ssh $hostname ps -ef |grep mysql`; 
} catch { 
    die "Failed to connect to ssh: $_"; 
} 
0

Au lieu de courir ssh directement, utilisez l'un des modules Perl supportant SSH (par exemple, Net::OpenSSH). Cela vous permettrait de vous connecter à l'hôte distant et d'exécuter autant de commandes que nécessaire sur cette seule connexion. Il détectera toute erreur de connexion et en rendra compte de manière appropriée.

Vous pouvez également paralléliser l'opération à l'aide de Net::OpenSSH::Parallel.