典型的UNIX®管理员经常使用一系列重要的实用程序,技巧和系统,以协助管理过程。 有一些关键实用程序,命令行链和脚本可用于简化不同的过程。 这些工具中的一部分随操作系统一起提供,但是大多数技巧来自多年的经验以及减轻系统管理员生活的渴望。 本系列的重点是从各种不同UNIX环境中的可用工具中获取最大收益,包括简化异构环境中管理的方法。
您可以通过多种方式监视UNIX服务器。 请参阅相关主题监视可用的类型的一些例子。 监视单个服务器不是问题,但是跨多个服务器监视相同信息可能会带来问题。 如果您所管理的其中一台服务器磁盘空间不足,您希望在它开始影响用户和客户端之前先了解一下。
以这种方式监视多个服务器,尤其是如果它们使用各种不同的操作系统时,可能是一个问题。 命令行工具,输出格式,值和其他信息的差异使原本应该是简单的过程变得复杂。 所需要的是一个解决方案,该解决方案可以为工作信息提供通用接口,而与您使用的UNIX变体无关。
简单网络管理协议(SNMP)提供了一种用于管理有关不同系统的信息的方法。 代理在每个系统上运行,并使用SNMP向不同的管理系统报告信息。
SNMP通常是路由器和交换机等网络设备的内置组件,并且是可用于远程检索统计信息和状态信息(无需登录某种界面)的唯一方法。 在大多数主机上,您将需要显式运行SNMP软件以通过SNMP协议公开有关主机的信息。
可以通过使用GET请求请求信息从代理中明确检索信息,或者代理可以使用TRAP或INFORM消息向管理系统广播信息。 另外,管理系统可以在代理上设置信息和参数,但这通常仅用于更改网络配置。
可以共享的信息类型可以多种多样。 它可以是所有内容,从网络设置,统计信息和网络接口的度量数据到监视CPU负载和磁盘空间。
SNMP标准未定义代理返回的信息。 而是,可用信息由管理信息库(MIB)定义。 MIB定义了返回的信息的结构,并使用对象标识符(OID)组织成层次结构。 您可以通过使用MIB结构中的特定位置请求数据来访问代理中的信息。
例如,清单1中显示了一些更常见的ID。
sysDescr.0 1.3.6.1.2.1.1.1.0
sysObjectId.0 1.3.6.1.2.1.1.2.0
sysUpTime.0 1.3.6.1.2.1.1.3.0
sysContact.0 1.3.6.1.2.1.1.4.0
sysName.0 1.3.6.1.2.1.1.5.0
sysLocation.0 1.3.6.1.2.1.1.6.0
sysServices.0 1.3.6.1.2.1.1.7.0
ifNumber.0 1.3.6.1.2.1.2.1.0
从该列表中可以看到,MIB是数字的,并且实际上是按顺序排列的。 获取信息时,可以使用GET请求获取特定值,也可以使用GETNEXT从读取的最后一个属性中获取下一个属性。 您也可以使用名称。 上面显示的名称都是系统树的一部分,因此您可以通过使用OID'system.sysUpTime.0'来读取值。
您读取的值也属于特定类型。 您可以读取全部定义为“标量”对象的整数,浮点数和字符串值。 在这些对象中是具有特定重要性的类型。 例如,时间间隔值被报告为“时间间隔”或百分之一秒。 这些值在显示之前需要转换为更具可读性的人类形式。 也有MIB对象返回表格数据。 这是通过返回可以组合在一起以构成SNMP表的其他OID实例来处理的。
从安全角度来看,SNMP代理可以与特定社区关联,并且可以通过使用社区作为验证其对代理访问权限的方法来管理系统访问信息。 在SNMP标准的版本1中,团体字符串是保护或限制访问的唯一方法。 使用SNMP标准的版本2,可以提高安全性,但处理起来可能很复杂。 对于第3版(自2004年以来为最新版本),该标准通过显式身份验证和访问控制系统进行了改进。
从SNMP系统获取信息的方式有很多,包括使用专业的管理工具,编程接口和命令行工具。
在后者中,最有名和最容易使用的是snmpwalk命令,它是较大的SNMP工具套件的一部分,该套件允许您直接从命令行从SNMP代理获取信息。 此命令将遍历给定管理值的整个子树,并返回有关该子树中包含的系统的所有信息。
例如,清单2显示了查询本地系统以获取“系统”树中所有信息时的输出。
$ snmpwalk -Os -c MCSLP -v 1 localhost system
sysDescr.0 = STRING: Linux tweedledum 2.6.23-gentoo-r8
#1 SMP Tue Feb 12 16:32:14 GMT 2008 x86_64
sysObjectID.0 = OID: netSnmpAgentOIDs.10
sysUpTimeInstance = Timeticks: (34145553) 3 days, 22:50:55.53
sysContact.0 = STRING: root@Unknown
sysName.0 = STRING: tweedledum
sysLocation.0 = STRING: serverroom
sysORLastChange.0 = Timeticks: (0) 0:00:00.00
sysORID.1 = OID: snmpFrameworkMIBCompliance
sysORID.2 = OID: snmpMPDCompliance
sysORID.3 = OID: usmMIBCompliance
sysORID.4 = OID: snmpMIB
sysORID.5 = OID: tcpMIB
sysORID.6 = OID: ip
sysORID.7 = OID: udpMIB
sysORID.8 = OID: vacmBasicGroup
sysORDescr.1 = STRING: The SNMP Management Architecture MIB.
sysORDescr.2 = STRING: The MIB for Message Processing and Dispatching.
sysORDescr.3 = STRING: The management information definitions for
the SNMP User-based Security Model.
sysORDescr.4 = STRING: The MIB module for SNMPv2 entities
sysORDescr.5 = STRING: The MIB module for managing TCP implementations
sysORDescr.6 = STRING: The MIB module for managing IP and ICMP implementations
sysORDescr.7 = STRING: The MIB module for managing UDP implementations
sysORDescr.8 = STRING: View-based Access Control Model for SNMP.
sysORUpTime.1 = Timeticks: (0) 0:00:00.00
sysORUpTime.2 = Timeticks: (0) 0:00:00.00
sysORUpTime.3 = Timeticks: (0) 0:00:00.00
sysORUpTime.4 = Timeticks: (0) 0:00:00.00
sysORUpTime.5 = Timeticks: (0) 0:00:00.00
sysORUpTime.6 = Timeticks: (0) 0:00:00.00
sysORUpTime.7 = Timeticks: (0) 0:00:00.00
sysORUpTime.8 = Timeticks: (0) 0:00:00.00
您可以在此处看到有关主机的一系列信息,包括操作系统(在sysDescr.0
),系统可用的时间量( sysUpTimeInstance
)以及计算机的位置。 此处的间隔时间以其原始值(时间标记)和转换后的人类可读的天数(小时:分钟:秒)显示。
计算机的正常运行时间或可用性是SNMP的一种非常普遍的用法,因为它可能提供最方便,最有效的方法来确定计算机是否已启动并正在处理请求。 在该系列的过去部分中已经描述的其他解决方案包括ping或使用rwho和ruptime。 后两种解决方案占用大量CPU和网络,并且在资源利用率方面也不是很友好。
但是请注意,此处描述的运行时间限制是SNMP代理的运行时间中显示的信息,而不是整个计算机的运行时间。 在大多数情况下,两者是相同的,特别是对于具有内置SNMP监视的设备,例如网络路由器和交换机。 对于通过SNMP公开其状态的计算机,系统和SNMP代理正常运行时间之间可能会有差异。
您可以使用snmpstatus通过SNMP更快地了解计算机的状态。 这样可以从指定的SNMP代理获取许多数据点,包括IP地址,描述,正常运行时间和网络统计信息(发送/接收的数据包以及发送/接收的IP数据包)。 例如,如果我们查看Solaris主机,则可以看到简化的信息,如清单3所示。
$ snmpstatus -v1 -c public t1000
[192.168.0.26]=>[SunOS t1000 5.11 snv_81 sun4v] Up: 2:12:10.20
Interfaces: 4, Recv/Trans packets: 643/160 | IP: 456/60
2 interfaces are down!
这台机器最近已重新启动(因此正常运行时间和数据包统计信息都很低)。 snmpstatus命令还确定计算机上的两个接口(具有四个以太网端口)已关闭。 这是SNMP可以提供的警告信息的一个很好的示例,以帮助您通知需要进一步调查的问题。
要获取特定信息,可以使用snmpget命令,该命令直接读取一个或多个OID并报告其值。 对于特殊类型,它还将转换为人类可读的格式。 例如,要获取系统描述和正常运行时间,请使用以下命令(清单4)。
$ snmpget -v1 -c public t1000 system.sysUpTime.0 system.sysContact.0
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (867411) 2:24:34.11
SNMPv2-MIB::sysContact.0 = STRING: "System administrator"
孤立地,所有这些方法都是有用的,但实际上,您需要能够监视和跟踪多台计算机和多个OID,以全面了解正在发生的事情。 我们可以通过使用SNMP的许多可编程接口之一来做到这一点。
用于Perl的Net::SNMP
模块使用SNMP从一个或多个代理获取信息。 其他类似的接口也可用于其他语言,包括Python,Ruby和PHP(请参阅参考资料 )。 该接口通过创建与所需主机上的SNMP代理进行通信(并在必要时进行身份验证)的会话来工作。 进行有效的会话后,您可以直接向代理请求一个或多个OID的数据。 该信息以信息散列的形式返回,该信息散列在OID和相应的值之间。
清单5显示了一个非常简单的脚本,该脚本将获取命令行中提供的每个主机的系统正常运行时间。
Net::SNMP
获得单个SNMP代理属性 #! /usr/local/bin/perl
use strict;
use Net::SNMP;
my $uptimeOID = '1.3.6.1.2.1.1.3.0';
foreach my $host (@ARGV)
{
my ($session, $error) = Net::SNMP->session(
-hostname => $host,
-community => 'public',
-port => 161
);
warn ("ERROR for $host: $error\n") unless (defined($session));
my $result = $session->get_request(
-varbindlist => [$uptimeOID]
);
if (!defined($result))
{
warn ("ERROR: " . $session->error . "\n");
}
else
{
printf("Uptime for %s: %s\n",$host, $result->{$uptimeOID});
}
$session->close;
}
在脚本中,我们为系统提供了完整的数字OID,即sysUpTime属性。 当使用get_request()
方法作为对数组的引用时,必须提供要获取的OID列表,然后从返回的哈希中拉出信息。 在清单5中,我们在调用过程中动态构建了数组引用,然后在输出结果时使用OID作为哈希键。
使用该脚本,我们可以获得命令行上提供的每个主机的正常运行时间列表(参见清单6)。
$ perl uptime.pl tweedledum t1000
Uptime for tweedledum: 4 minutes, 52.52
Uptime for t1000: 6 minutes, 26.12
当然,手动查看此信息几乎没有效率。
一次查看SNMP OID属性的单个实例并不总是很有用。 通常,您想监视一段时间内的某些事物(例如,可用性),或者想要监视特定值的变化。 磁盘空间就是一个很好的例子。 可以将SNMP配置为记录各种信息,并且磁盘空间是要监视的常见系统,因此您不仅可以识别磁盘空间何时达到特定级别,还可以识别磁盘空间是否有重大变化。 ,这可能表示有问题。
例如,清单7显示了一个基于回调的解决方案,用于不断监视磁盘空间。 在脚本中,我们输出运行总计,但是可以将其配置为仅输出磁盘空间减少时触发的警告消息。
#! /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 monitoring\n"
}
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: %s\n", $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]
);
}
该脚本分为两部分,并使用Net::SNMP
模块中的某些功能,当您从主机获取SNMP值时,该功能可让您调用函数,并具有通过简单的方式连续监视主机和SNMP对象的功能,但高效,循环。
第一部分设置每个主机以监视信息。 我们仅监视一条信息,但可以将其他信息监视为解决方案的一部分。 该对象被配置为“非阻塞”,因此,如果无法访问主机,脚本将不会等待,而只是移至下一个主机。 最后,在对get_request()
的调用中,我们提交了回调信息。 这里的第一个参数是从代理收到响应时要调用的函数的名称。 第二个参数是调用该函数时将提供给该函数的参数。
我们将使用此参数来记录和跟踪SNMP调用返回的先前值。 在回调函数中,我们将新返回的值与先前的值进行比较。 如果有减少,我们将计算减少百分比,然后报告警告。
回调的最后一部分是指定应进行另一次检索,此处指定下一次检索应延迟60秒。 现有的回调信息将保留。 实际上,该脚本从SNMP代理获取值,调用回调函数,然后在以后将另一个检索排队。 由于已经定义了相同的回调,因此该过程将以无限循环的方式重复进行。
顺便说一句,脚本使用dskAvail OID值,并根据最新值和新值计算百分比差异。 此属性所属的dskTable树实际上具有我们可以查询的磁盘百分比属性,而不是手动计算。 但是,返回的值可能不够细致,无法使用。
您可以使用snmpwalk输出dskTable树来查看此属性和当前值,该树本身是UCD MIB的一部分(清单8)。
$ snmpwalk -v 1 localhost -c public UCD-SNMP-MIB::dskTable
UCD-SNMP-MIB::dskIndex.1 = INTEGER: 1
UCD-SNMP-MIB::dskPath.1 = STRING: /
UCD-SNMP-MIB::dskDevice.1 = STRING: /dev/sda3
UCD-SNMP-MIB::dskMinimum.1 = INTEGER: 100000
UCD-SNMP-MIB::dskMinPercent.1 = INTEGER: -1
UCD-SNMP-MIB::dskTotal.1 = INTEGER: 72793272
UCD-SNMP-MIB::dskAvail.1 = INTEGER: 62024000
UCD-SNMP-MIB::dskUsed.1 = INTEGER: 7071512
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 10
UCD-SNMP-MIB::dskPercentNode.1 = INTEGER: 3
UCD-SNMP-MIB::dskErrorFlag.1 = INTEGER: noError(0)
UCD-SNMP-MIB::dskErrorMsg.1 = STRING:
要首先找到该属性,可以使用snmptranslate转储所有已知的属性。 通过使用grep进行过滤,我们可以看到我们想要的信息: $ snmptranslate -Ts |grep dsk
。
要获取数值,请使用snmptranslate并为该名称提供-On选项(请参见清单9)。
$ snmptranslate -On UCD-SNMP-MIB::dskAvail
.1.3.6.1.4.1.2021.9.1.7
运行脚本,我们将获得有关指定主机上磁盘空间使用情况的运行注释(和警告)。 参见清单10。
$ perl diskspace-auto.pl tweedledum
tweedledum Ok (50319024)
WARNING: tweedledum has lost 2.67% diskspace)
tweedledum Ok (48976392)
WARNING: tweedledum has lost 1.65% diskspace)
tweedledum Ok (48166292)
tweedledum Ok (48166292)
tweedledum Ok (48166292)
tweedledum Ok (48166292)
从此输出中可以看到,我们已经失去了指定主机上该磁盘上可用空间中的一些重要空间。 要监视更多主机,只需在命令行上添加更多主机名。
SNMP软件包包括一个守护程序snmpd,可以将其配置为使用SNMP协议公开各种信息。 使用/etc/snmpd.conf文件控制要公开的信息的配置。
例如,清单11显示了本文前面的示例中使用的主机上的snmpd.conf文件。
syslocation serverroom
proc imapd 20 10
disk / 100000
load 5 10 10
这些行中的每一行都填充不同的信息。 在示例中,我们设置了机器的位置,然后配置了一些要监视的特定项目。
proc部分监视特定的过程,在此显示为邮件服务的IMAP守护程序的监视程序。 该选项后面的数字指定允许运行的最大进程数,以及应该运行的最小进程数。 您可以使用它来确保特定服务正在运行,并且没有超出可能指示故障的容量。 当进程计数超过MAX值时,将生成SNMP陷阱。
对于磁盘,您可以指定要监视的目录的路径以及磁盘应具有的最小大小(以千字节为单位)。 同样,如果磁盘空间下降到该值以下,则会触发SNMP陷阱。
最后,负载信息显示应报告的1分钟,5分钟和15分钟的最大CPU负载。 这等效于uptime命令的输出,该命令显示了这些时间间隔内的进程负载。 像其他配置的限制一样,当超出这些限制时,会引发陷阱。
手动设置此信息并不困难,但也不理想。 如果您想要一种更简单的设置配置方法,可以使用基于菜单的简单解决方案snmpconf。
监视服务器和设备是一个非常复杂的过程,尤其是随着网络中设备数量的增加。 SNMP是公开和报告此信息的一种有效且可扩展的方法。 由于接口在所有设备上都是一致的,因此您可以在多个主机上使用相同的方法来获得正常运行时间,网络统计信息,磁盘空间甚至进程监视。
在本文中,我们既研究了SNMP的基础知识,又研究了如何从不同的主机读取特定的值。 使用Net :: SNMP perl模块,我们还研究了使用基于一键式和基于连续监视的解决方案读取信息的方法。 最后,我们研究了用于配置要在系统上公开的其他信息的方法,以便在使用snmpd守护程序时可以自定义和监视网络所需的系统。
翻译自: https://www.ibm.com/developerworks/aix/library/au-satsnmp/index.html