- snmpd.conf简单配置
- 通过脚本方式扩展agent采集自身所需要的信息
- 一个基于snmp4j的snmp manager实现
有关snmp的介绍不想多说,它本身只是一个协议,在各操作系统平台下都有自己的实现。由于集群都是Linux系统,所以选择了最流行的net-snmp,各个Linux版本的软件库中应该都会包含(其实windows下面也有)。软件本身也可分为agent(snmpd包)和manager(snmp包)两部分。顾名思义,snmpd作为deamon,应该部署到被监控的节点上;而manager则包含了一系列snmpget、snmpset、snmpwalk等工具,应该被安装在监控服务器上。由于我们会用snmp4j来进行信息收集和一些配置工作(它本身就能提供snmpget、snmpset等功能),因此从理论上来讲,snmp这个包可有可无,但为了方便调试,一般还是会装上。
在安装完snmpd之后,首要任务是修改/etc/snmp/snmpd.conf配置。默认的配置文件会给出很多的注释和参考示例,很清晰。总结来说需要修改或添加以下项:
agentAddress udp:161,udp6:[::1]:161 ####### 为了能在非本地访问,监听所有161端口
view all❘-included .1 ####### 添加一个名为all的可以访问.1入口下所有MIB库的组
rwcommunity test default -V all ####### 添加一个对于组all具有读写权限的用户名test
extend-sh disk_info_sda1 /bin/bash /tmp/script/disk_info.sh sda1 ####### 扩展一个名为disk_info_sda1的项,执行所给地址的脚本,并以sda1为参数,结果为脚本的输出值
注意修改完后要重启一下snmpd服务。snmp协议的3个版本,只有v3才提供了安全方面的功能,也可以通过这个文件配置,这里我们先略去不谈。
snmp以MIB库的形式来管理数据。就像是一棵树,其每个叶子节点所对应的OID都可以用来访问某个特定的数据项。可以利用snmpget命令来获取某个OID对应的值,也可以用snmpwalk来遍历以给定节点为根的子树,输出其包含的所有数据项。snmp本身为我们提供了很多可以获取的有用的数据,可以通过http://www.oidview.com/mibs/detail.html这个网站进行查询,但有时候,这些数据格式或内容可能与我们想要的不一致,这时候就要用到agent扩展。net-snmp本身提供了多种扩展方式,我们仅用到了最简单的脚本方式(上述已经配置过),新添加的扩展都会被添加到NET-SNMP-EXTEND-MIB(1.3.6.1.4.1.8072.1.3.2)这个入口之下。我们通过遍历命令,可以得到如下结果(假设只有一个disk_info_sda1扩展项):
snmpwalk -v 2c -c test localhost 1.3.6.1.4.1.8072.1.3.2
NET-SNMP-EXTEND-MIB::nsExtendNumEntries.0 = INTEGER: 1
NET-SNMP-EXTEND-MIB::nsExtendCommand."disk_info_sda1" = STRING: /bin/bash
NET-SNMP-EXTEND-MIB::nsExtendArgs."disk_info_sda1" = STRING: /tmp/script/disk_info.sh sda1
NET-SNMP-EXTEND-MIB::nsExtendInput."disk_info_sda1" = STRING:
NET-SNMP-EXTEND-MIB::nsExtendCacheTime."disk_info_sda1" = INTEGER: