如何在多个服务器上执行命令以执行命令

时间:2018-12-27 09:46:18

标签: regex perl

我有一组用于记录的服务器(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 :(得分:1)

在Perl中需要这样做吗?现有的工具dsh提供了使用ssh在多个主机上运行Shell命令并报告每个主机的输出的精确功能。它还具有通过-c(并发)开关在所有主机上同时运行命令的能力,而不必等到每个主机都完成后再继续执行下一个,这是您需要的每10分钟监视150台计算机,但是检查每个主机需要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,因此命令被立即发送到所有三台服务器,并且结果按接收到的响应顺序打印。没有{{1} },它们的显示顺序与-c文件中列出的服务器相同,但是在连接到下一个服务器之前,它将等待每个响应。)

但是,实际上,每10分钟重复一次此检查,这听起来像是您真正想要的是一个合适的监视系统,例如Icinga(知名的{{ 3}}),而不仅仅是在多台计算机上远程运行命令的方式(group提供了这种方法)。不幸的是,配置Icinga监视系统对我来说太麻烦了,因此无法在此处提供示例,但是我可以告诉您,监视磁盘空间是使用时默认包含并启用的检查之一。

答案 1 :(得分:-1)

为此目的,有一个名为Ansible的现成工具。在那里,您可以定义服务器列表,然后进行分组并在所有服务器上执行命令。