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";
}
它必须为每个服务器发送磁盘空间输出
答案 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的现成工具。在那里,您可以定义服务器列表,然后进行分组并在所有服务器上执行命令。