2017-10-17 1 views
2

私は実際にsshを実行する前にサーバにsshできるかどうかを最初にチェックしたいと思うperlスクリプトを持っています。したがって、sshが可能であれば、そのサーバーにsshを実行してください。それ以外の場合は、この例外を適切に処理してください。リモートサーバにsshできるだけ確認するPerlスクリプト

だから私は、データベースのリストをテキストファイルを経由して、サーバはMySQLのSSTを実行されているかどうかをチェックbashコマンドを実行するために、各サーバにsshをしようとすると、このスクリプトを持っている:

#!/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; 
をそのサーバーがダウンして(それゆえににsshをすることはできません)であるかどうか

ので、おそらく以下の3行を実行する前に、私が知っていることができるようにしたい(そして、以下のコマンドでそれにSSH):

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`; 

方法これを達成することができますか?ちなみに、スラックURLは変更されており、セキュリティ上の心配はありません。

答えて

1

サーバにsshできるかどうかを判断する最も信頼性の高い方法は、実際にsshを実行しようとすることです。

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

代わりの直接sshを実行している、(例えば、Net::OpenSSH)SSHをサポートするPerlモジュールのいずれかを使用:ちょうど接続すると、それが失敗した場合、失敗を報告し、任意の更なる試みを中止しようとします。これにより、リモートホストに接続し、その単一の接続で必要なだけ多くのコマンドを実行することができ、接続エラーを検出して適切に報告します。

Net::OpenSSH::Parallelを使用して操作を並列化することもできます。

関連する問題