Sep 13

[原]自定义SNMP Agent 晴

linuxing , 14:48 , 网络服务 » 常见服务 , 评论(1) , 引用(0) , 阅读(38559) , Via 本站原创 | |
    通过[原]SNMP 原理及配置简述一文,我们知道,SNMP 发布的信息来自MIB,而MIB中定义的OID 数据,则是Agent 提供的。因此,除了SNMP 默认提供的监控信息外(实际上也是通过各个不同的Agent 获取),我们也可以自定义自己的Agent,用于监控其他资源信息,并发布给SNMP Manager 端。
    Linux 平台上使用的net-snmp 提供多种Agent 编写方式,较复杂的,可用C 调用其提供的API 接口来实现(附录中有份转载的文章)。简单的情况,可利用shell 脚本,借助net-snmp 提供的接口脚本来实现。这些,可参考/etc/snmp/snmpd.conf 中提供的说明。

一、Process 进程 监控
先看个最简单的,监控某个进程。该配置需写入/etc/snmp/snmpd.conf 文件中(下同)。
用法说明:
引用
proc NAME [MAX=0] [MIN=0]
NAME:需监控的进程名称,可用ps 获得;
MAX: 该进程最大允许的数量,默认为0;
MIN: 该进程最小必须运行的数量。

例如,我监控红旗 HA Server 的关键进程 clptrnsv :
引用
proc clptrnsv

保存后,重启snmpd服务,通过snmpwalk 查询.1.3.6.1.4.1.2021.2 节点,可得到相关的信息:
引用
# snmpwalk -v 2c -c opendata 192.168.228.148 .1.3.6.1.4.1.2021.2
UCD-SNMP-MIB::prIndex.1 = INTEGER: 1
UCD-SNMP-MIB::prNames.1 = STRING: clptrnsv
UCD-SNMP-MIB::prMin.1 = INTEGER: 0
UCD-SNMP-MIB::prMax.1 = INTEGER: 0
UCD-SNMP-MIB::prCount.1 = INTEGER: 1
UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: 0
UCD-SNMP-MIB::prErrMessage.1 = STRING:
UCD-SNMP-MIB::prErrFix.1 = INTEGER: 0
UCD-SNMP-MIB::prErrFixCmd.1 = STRING:

二、监控磁盘空间
用法:
引用
disk PATH [MIN=100000]
PATH: 监控的挂载点;
MIN: 当磁盘可用空间少于该定义值时,将在MIB的errorFlag中设置错误提示

例如,当前系统的根分区信息:
引用
# df |grep -w /
/dev/sda1             12381404   4557392   7320860  39% /

可用空间为7320860,而设置:
引用
disk / 8324340

查询:
引用
# snmpwalk -v 2c -c opendata 192.168.228.148 .1.3.6.1.4.1.2021.9
UCD-SNMP-MIB::dskIndex.1 = INTEGER: 1
UCD-SNMP-MIB::dskPath.1 = STRING: /
UCD-SNMP-MIB::dskDevice.1 = STRING: /dev/sda1
UCD-SNMP-MIB::dskMinimum.1 = INTEGER: 8324340
UCD-SNMP-MIB::dskMinPercent.1 = INTEGER: -1
UCD-SNMP-MIB::dskTotal.1 = INTEGER: 12381404
UCD-SNMP-MIB::dskAvail.1 = INTEGER: 7320848
UCD-SNMP-MIB::dskUsed.1 = INTEGER: 4557404
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 38
UCD-SNMP-MIB::dskPercentNode.1 = INTEGER: 12
UCD-SNMP-MIB::dskErrorFlag.1 = INTEGER: 1
UCD-SNMP-MIB::dskErrorMsg.1 = STRING: /: less than 8324340 free (= 7320848)

三、监控平均负载
用法:
引用
load [1MAX=12.0] [5MAX=12.0] [15MAX=12.0]
1MAX:当1分钟的负载超过该设定值,将在MIB的errorFlag中设置错误提示;
5MAX:当5分钟的负载超过该设定值,将在MIB的errorFlag中设置错误提示;
15MAX:当15分钟的负载超过该设定值,将在MIB的errorFlag中设置错误提示;

设置:
引用
load 12 14 14

查询:
引用
# snmpwalk -v 2c -c opendata 192.168.228.148 .1.3.6.1.4.1.2021.10
UCD-SNMP-MIB::laIndex.1 = INTEGER: 1
UCD-SNMP-MIB::laIndex.2 = INTEGER: 2
UCD-SNMP-MIB::laIndex.3 = INTEGER: 3
UCD-SNMP-MIB::laNames.1 = STRING: Load-1
UCD-SNMP-MIB::laNames.2 = STRING: Load-5
UCD-SNMP-MIB::laNames.3 = STRING: Load-15
UCD-SNMP-MIB::laLoad.1 = STRING: 0.00
UCD-SNMP-MIB::laLoad.2 = STRING: 0.00
UCD-SNMP-MIB::laLoad.3 = STRING: 0.00
UCD-SNMP-MIB::laConfig.1 = STRING: 12.00
UCD-SNMP-MIB::laConfig.2 = STRING: 14.00
UCD-SNMP-MIB::laConfig.3 = STRING: 14.00

UCD-SNMP-MIB::laLoadInt.1 = INTEGER: 0
UCD-SNMP-MIB::laLoadInt.2 = INTEGER: 0
UCD-SNMP-MIB::laLoadInt.3 = INTEGER: 0
UCD-SNMP-MIB::laLoadFloat.1 = Opaque: Float: 0.000000
UCD-SNMP-MIB::laLoadFloat.2 = Opaque: Float: 0.000000
UCD-SNMP-MIB::laLoadFloat.3 = Opaque: Float: 0.000000
UCD-SNMP-MIB::laErrorFlag.1 = INTEGER: 0
UCD-SNMP-MIB::laErrorFlag.2 = INTEGER: 0
UCD-SNMP-MIB::laErrorFlag.3 = INTEGER: 0
UCD-SNMP-MIB::laErrMessage.1 = STRING:
UCD-SNMP-MIB::laErrMessage.2 = STRING:
UCD-SNMP-MIB::laErrMessage.3 = STRING:

四、直接反馈脚本的运行结果
net-snmp 除可利用已定义的Agent外,还可把脚本的结果反馈到OID 节点上。根据反馈的结果表达形式不同,有两种写法。
1、脚本结果都放在单个节点上
用法说明:
引用
exec NAME PROGRAM [ARGS ...]
NAME:标识名称,与脚本名称没有直接关系
PROGRAM:脚本的绝对路径
ARGS:该脚本的参数

以参考文件中的脚本为例:

# cat /tmp/shtest
#!/bin/sh
echo hello world
echo hi there
exit 35

配置为:
引用
exec echotest /bin/sh /tmp/shtest

snmpwalk 的结果:
引用
# snmpwalk -v 2c -c opendata 192.168.228.148 .1.3.6.1.4.1.2021.8
UCD-SNMP-MIB::extIndex.1 = INTEGER: 1
UCD-SNMP-MIB::extNames.1 = STRING: echotest
UCD-SNMP-MIB::extCommand.1 = STRING: /bin/sh /tmp/shtest
UCD-SNMP-MIB::extResult.1 = INTEGER: 35
UCD-SNMP-MIB::extOutput.1 = STRING: hello world
hi there

UCD-SNMP-MIB::extErrFix.1 = INTEGER: 0
UCD-SNMP-MIB::extErrFixCmd.1 = STRING:

2、脚本结果插入子节点
上面的脚本,其运行结果无论有几行,都会放在单个节点上(extResult.1)。若结果需区分,则可用下面的形式:
引用
exec .1.3.6.1.4.1.2021.50 shelltest /bin/sh /tmp/shtest

这样,脚本的结果将插入子节点(在上述配置中可定义其插入的主节点位置)中,方便查询:
引用
# snmpwalk -v 2c -c opendata 192.168.228.148 .1.3.6.1.4.1.2021.50
UCD-SNMP-MIB::ucdavis.50.1.1 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.50.2.1 = STRING: "shelltest"
UCD-SNMP-MIB::ucdavis.50.3.1 = STRING: "/bin/sh /tmp/shtest"
UCD-SNMP-MIB::ucdavis.50.100.1 = INTEGER: 35
UCD-SNMP-MIB::ucdavis.50.101.1 = STRING: "hello world"
UCD-SNMP-MIB::ucdavis.50.101.2 = STRING: "hi there"

UCD-SNMP-MIB::ucdavis.50.102.1 = INTEGER: 0
UCD-SNMP-MIB::ucdavis.50.103.1 = ""

※ 注意,务必确保脚本的路径正确及可输出到标准输出中,而非后台,或tty 界面。

五、Pass 方式
若觉得上面的脚本方式仍不足以满足要求,net-snmp 还提供了Pass through control 的方式。采取该方式,将完全把mib 数据库中MIBOID 部分交给该脚本。那么,该脚本不单可用于查询mib ,若权限允许的话,还可用于设定OID 的值。
以net-snmp 包中提供的示例脚本passtest 为例,先把该脚本拷贝到方便运行的地址:
引用
# rpm -ql net-snmp|grep passtest
/usr/share/doc/net-snmp-5.1.2/passtest
# mv /usr/share/doc/net-snmp-5.1.2/passtest /usr/local/bin/passtest

设置:
引用
pass .1.3.6.1.4.1.2021.255 /bin/sh /usr/local/bin/passtest

查询:
引用
# snmpwalk -v 2c -c opendata 192.168.228.148 .1.3.6.1.4.1.2021.255
UCD-SNMP-MIB::ucdavis.255.1 = STRING: "life the universe and everything"
UCD-SNMP-MIB::ucdavis.255.2.1 = INTEGER: 42
UCD-SNMP-MIB::ucdavis.255.2.2 = OID: SNMPv2-SMI::private.42.42.42
UCD-SNMP-MIB::ucdavis.255.3 = Timeticks: (363136200) 42 days, 0:42:42.00
UCD-SNMP-MIB::ucdavis.255.4 = IpAddress: 127.0.0.1
UCD-SNMP-MIB::ucdavis.255.5 = Counter32: 42
UCD-SNMP-MIB::ucdavis.255.6 = Gauge32: 42

修改配置文件,为:
引用
view    rwview          included        .1.3.6.1.4.1.2021.255
access  notConfigGroup ""      any       noauth    exact all rwview none

可见,已经打开.1.3.6.1.4.1.2021.255节点的可写权限,则可用snmpset设置OID:
引用
# snmpset -v 1 -c opendata 192.168.228.148 .1.3.6.1.4.1.2021.255.1 s "New string"
UCD-SNMP-MIB::ucdavis.255.1 = STRING: "New string"

更多的注意事项,可见man 5 snmpd.conf 中passtest 部分的说明。

※ 再提供一个由Jamie Wilkinson jamie@anchor.net.au 编写的SNMP disk IO collector Agent 脚本。
这是第三版,来自:spaceblog,兼容2.4 和 2.6 核心,可适用于net-snmp 没有配置--with-mib-modules=ucd-snmp/diskio编译选项时使用。

为避免与net-snmp中ucd-snmp/diskio Agent 冲突,我把脚本中OID节点位置变量PLACE,从原来的".1.3.6.1.4.1.2021.13.15",改为".1.3.6.1.4.1.2021.256"。因此,在/etc/snmp/snmpd.conf 中配置如下:
引用
pass .1.3.6.1.4.1.2021.256 /usr/local/bin/snmp-diskio-collector

重启snmpd 服务后,即可用snmpwalk 获取磁盘I/O 资源信息:
引用
# snmpwalk -v 2c -c opendata 192.168.228.148 .1.3.6.1.4.1.2021.256
......
UCD-SNMP-MIB::ucdavis.256.1.1.3.18 = Counter32: 414970
UCD-SNMP-MIB::ucdavis.256.1.1.3.19 = Counter32: 249609
UCD-SNMP-MIB::ucdavis.256.1.1.3.20 = Counter32: 2148
......

六、其他Agent
1、监控特定硬件信息
大的硬件厂商,会提供SNMP Agent,以便于监控其硬件状态信息,例如CPU 温度、核心电压等。在下面的链接中,提到HP、Dell 提供的SNMP Agent :
http://polygun2000.spaces.live.com/blog/cns!182B490BAC7D9686!283.entry
文档打包如下:

2、其他开发方式
net-snmp 提供了很多API 接口,例如C 库等,下面的文档可供参考:
用NET-SNMP软件包开发简单客户端代理(C 方式)
attachment.php?fid=886
Oracle Developing an SNMP Agent
Free Teaching Material on Systems and Network Management
NET-SNMP v5.x Tutorial
Tags:
博爱老头 Homepage
2010/09/15 15:24
好同学啊,现在已经没有贴一屏代码的毅力了。
linuxing 回复于 2010/09/16 13:28
^_^,那是因为你已经处在比我高的位置了,释放了。
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]