Você pode fazer algo assim:
'ssh $hostname true';
if ($? == 0) {
...;
} else {
die "ssh failed";
}
Eu tenho um script perl em que eu quero primeiro verificar se é possível ssh no servidor antes de eu realmente fazer ssh. Então, se for possível para o ssh, vá em frente e faça ssh nesse servidor, caso contrário, manipule essa exceção apropriadamente.
Então eu tenho esse script que passa por um arquivo de texto com uma lista de bancos de dados e tenta ssh em cada servidor para executar um comando bash que verifica se o servidor está executando o MySQL SST ou não:
#!/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;
Então, provavelmente, antes de executar as três linhas abaixo, eu quero ser capaz de saber se esse servidor está inativo (portanto não pode ssh nele) ou não (então ssh nele com os comandos abaixo):
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';
Como posso fazer isso? A propósito, o URL slack foi alterado para que a segurança se preocupe.
Eu adicionei o código sugerido abaixo, mas ainda não parece estar funcionando:
...
while( my $hostname = <$info>) {
chomp( $hostname );
my $ssh_ping = '$ssh_cmd\'@\'$hostname true';
if ( '$ssh_ping true'){
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);
}
}
} #end $ssh_ping if
} #end while