Sep
13
通过[原]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 文件中(下同)。
用法说明:
例如,我监控红旗 HA Server 的关键进程 clptrnsv :
保存后,重启snmpd服务,通过snmpwalk 查询.1.3.6.1.4.1.2021.2 节点,可得到相关的信息:
二、监控磁盘空间
用法:
例如,当前系统的根分区信息:
可用空间为7320860,而设置:
查询:
三、监控平均负载
用法:
设置:
查询:
四、直接反馈脚本的运行结果
net-snmp 除可利用已定义的Agent外,还可把脚本的结果反馈到OID 节点上。根据反馈的结果表达形式不同,有两种写法。
1、脚本结果都放在单个节点上
用法说明:
以参考文件中的脚本为例:
配置为:
snmpwalk 的结果:
2、脚本结果插入子节点
上面的脚本,其运行结果无论有几行,都会放在单个节点上(extResult.1)。若结果需区分,则可用下面的形式:
这样,脚本的结果将插入子节点(在上述配置中可定义其插入的主节点位置)中,方便查询:
※ 注意,务必确保脚本的路径正确及可输出到标准输出中,而非后台,或tty 界面。
五、Pass 方式
若觉得上面的脚本方式仍不足以满足要求,net-snmp 还提供了Pass through control 的方式。采取该方式,将完全把mib 数据库中MIBOID 部分交给该脚本。那么,该脚本不单可用于查询mib ,若权限允许的话,还可用于设定OID 的值。
以net-snmp 包中提供的示例脚本passtest 为例,先把该脚本拷贝到方便运行的地址:
设置:
查询:
修改配置文件,为:
可见,已经打开.1.3.6.1.4.1.2021.255节点的可写权限,则可用snmpset设置OID:
更多的注意事项,可见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 中配置如下:
重启snmpd 服务后,即可用snmpwalk 获取磁盘I/O 资源信息:
六、其他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
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: 该进程最小必须运行的数量。
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:
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中设置错误提示
PATH: 监控的挂载点;
MIN: 当磁盘可用空间少于该定义值时,将在MIB的errorFlag中设置错误提示
例如,当前系统的根分区信息:
引用
# df |grep -w /
/dev/sda1 12381404 4557392 7320860 39% /
/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)
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中设置错误提示;
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:
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:该脚本的参数
NAME:标识名称,与脚本名称没有直接关系
PROGRAM:脚本的绝对路径
ARGS:该脚本的参数
以参考文件中的脚本为例:
# cat /tmp/shtest
#!/bin/sh
echo hello world
echo hi there
exit 35
#!/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:
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 = ""
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
/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
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
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"
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
......
......
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
博爱老头
2010/09/15 15:24
好同学啊,现在已经没有贴一屏代码的毅力了。
linuxing 回复于 2010/09/16 13:28
^_^,那是因为你已经处在比我高的位置了,释放了。
分页: 1/1 1