Как выполнить команду на нескольких серверах для выполнения команды - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть набор серверов (150) для регистрации и команда (чтобы получить место на диске).Как я могу выполнить эту команду для каждого сервера.Предположим, если сценарий занимает 1 минуту, чтобы получить отчет о команде для одного сервера, как я могу отправлять отчет для всех серверов за каждые 10 минут?

 use strict;
 use warnings;
 use Net::SSH::Perl;
 use Filesys::DiskSpace;


 # i have almost more than 100 servers..
 my %hosts   = (
    'localhost' => {
                       user  => "z",
                   password  => "qumquat",

    },


     '129.221.63.205' => {
                           user  => "z",
                       password  => "aardvark",

    },
'129.221.63.205' => {
                           user  => "z",
                       password  => "aardvark",

    },  


   );


  # file system /home or /dev/sda5 
  my $dir = "/home";

  my $cmd =  "df $dir";

  foreach my $host (keys %hosts) {
          my $ssh = Net::SSH::Perl->new($host,port => 22,debug => 1,protocol => 2,1 );    

      $ssh->login($hostdata{$host}{user},$hostdata{$host}{password} );
      my ($out) = $ssh->cmd($cmd});
          print "$out\n";
   }

Он должен отправлять вывод дискового пространства для каждого сервера

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Есть ли причина, по которой это нужно делать в Perl?Существует существующий инструмент dsh , который обеспечивает именно эту функциональность использования ssh для запуска команды оболочки на нескольких хостах и ​​выдачи отчета о выходе каждого из них.Он также имеет возможность с помощью переключателя -c (одновременный) одновременно запускать команду на всех хостах, а не ждать завершения каждого из них, прежде чем переходить к следующему, что вам понадобится, если вы хотите отслеживать150 машин каждые 10 минут, но проверка каждого хоста занимает 1 минуту.

Чтобы использовать dsh, сначала создайте файл в ~/.dsh/group/, содержащий список ваших серверов.Я положу мой в ~/.dsh/group/test-group с содержанием:

galera-1
galera-2
galera-3

Тогда я могу запустить команду

dsh -g test-group -c 'df -h /'

и получить результат:

galera-3: Filesystem                 Size  Used Avail Use% Mounted on
galera-3: /dev/mapper/debian-system  140G   36G   99G  27% /
galera-1: Filesystem                 Size  Used Avail Use% Mounted on
galera-1: /dev/mapper/debian-system  140G   29G  106G  22% /
galera-2: Filesystem                 Size  Used Avail Use% Mounted on
galera-2: /dev/mapper/debian-system  140G   26G  109G  20% /

(Они вышли из строя, потому что я использовал -c, поэтому команда была отправлена ​​на все три сервера одновременно, и результаты были напечатаны в порядке получения ответов. Без -c они будут отображатьсяв том же порядке серверы перечислены в файле group, но затем он будет ждать каждого ответа перед подключением к следующему серверу.)

Но, на самом деле, речь идет о повторении этой проверки каждые 10минут, звучит так, как будто вам нужна действительно система мониторинга, такая как Icinga (высокопроизводительный форк более известного Nagios ), а не просто способ запускакоманды удаленно на нескольких машинах (что обеспечивает dsh).К сожалению, настройка системы мониторинга Icinga слишком сложна, чтобы я мог привести здесь пример, но я могу вам сказать, что мониторинг дискового пространства является одной из проверок, которые включаются и включаются по умолчанию при его использовании.

0 голосов
/ 27 декабря 2018

Для этой цели есть готовый инструмент под названием Ansible.Там вы можете определить свой список серверов, сгруппировать их и выполнить команды на всех них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...