系统管理员工具包: 使用 SNMP 数据
2008-11-13 08:29:29 来源:WEB开发网在该脚本中,我们提供了系统的完整数字 OID、sysUpTime 属性。在使用 get_request() 方法作为对数组的引用时,您必须提供要获得的 OID 的列表,然后从返回的散列中提取信息。在清单 5 中,我们在调用期间动态地构建了数组引用,然后在打印结果时使用 OID 作为散列键。
使用该脚本,我们可以获取命令行上提供的每个主机的正常运行时间列表(请参见清单 6)。
清单 6. 每个主机的正常运行时间列表
$ perl uptime.pl tweedledum t1000
Uptime for tweedledum: 4 minutes, 52.52
Uptime for t1000: 6 minutes, 26.12
当然,人工观察此信息是非常低效的。
跟踪一段时间内的 SNMP 数据
一次查看某个 SNMP OID 属性的单个实例并不非常具有实际意义。通常,您希望监视某些属性(例如可用性)在一段时间内的情况,或者希望监视特定值的变化情况。一个很好的示例就是磁盘空间。可以配置 SNMP 以记录所有类型的信息,其中磁盘空间是您希望监视的常见系统,以便不仅能够确定磁盘空间何时达到某个特定的级别,而且还可以确定何时磁盘空间存在重大变化(这可能指示某个问题)。
例如,清单 7 显示了一个基于回调的解决方案,以连续监视磁盘空间。在该脚本中,我们输出了累计总数,但是可以配置该脚本仅输出存在磁盘空间减少时触发的警告消息。
清单 7. 获取 SNMP 属性的累计视图
#! /usr/local/bin/perl
use strict;
use warnings;
use Net::SNMP qw(snmp_dispatcher);
my $diskspaceOID = '1.3.6.1.4.1.2021.9.1.7.1';
foreach my $host (@ARGV)
{
my ($session, $error) = Net::SNMP->session(
-hostname => $host,
-nonblocking => 0x1,
);
if (!defined($session))
{
warn "ERROR: $host produced $error - not monitoringn"
}
else
{
my ($last_poll) = (0);
$session->get_request(
-varbindlist => [$diskspaceOID],
-callback => [
&diskspace_cb, $last_poll
]
);
}
}
snmp_dispatcher();
exit 0;
sub diskspace_cb
{
my ($session, $last_poll) = @_;
if (!defined($session->var_bind_list))
{
printf("%-15s ERROR: %sn", $session->hostname, $session->error);
}
else
{
my $space = $session->var_bind_list->{$diskspaceOID};
if ($space < ${$last_poll})
{
my $diff = ((${$last_poll}-$space)/${$last_poll})*100;
printf("WARNING: %s has lost %0.2f%% diskspace)n",
$session->hostname,$diff);
}
printf("%-15s Ok (%s)n",
$session->hostname,
$space
);
${$last_poll} = $space;
}
$session->get_request(
-delay => 60,
-varbindlist => [$diskspaceOID]
);
}
更多精彩
赞助商链接