前几天写了一个运维工具,用来监控夜间业务的处理情况。
虽然是生产网,但由于都是内部网络,所以决定谨慎采用snmp来获取一些信息。其中的一个需求是,根据某个指定的业务日期从远程服务器的日志中分析产生结果,然后将结果在本地监控机上呈现。
这个需求的实现有很多种方法,我这边利用 net-snmp 的扩展命令 pass 调用 shell 脚本来实现。通过 man snmpd.conf(5) 可知,net-snmp支持自定义的脚本以获取需要的信息,那就是扩展命令exec、extend 和 pass(三者的区别详见此 FAQ)。
pass命令整合了三个EXEC执行过程:
PROG -g MIBOID — g 代表 get
PROG -n MIBOID — n 代表 getnext
上述两条调用指令对应的功能便是 snmpget 和 snmpgetnext,PROG 表示 Shell脚本本身 。
如果你在某台监控机上执行 snmpget 命令来通过 pass 调用 shell 脚本获取信息时,shell 脚本的输出结果是有格式要求的:
输出到 stdout 的第一行必须是 MIB OID
第二行必须是 TYPE (string, integer, unsigned, objectid, timeticks, ipaddress, counter, gauge)
第三行必须是与 TYPE 相对应的 VALUE
举个例子,假如 oid .1.3.6.1.4.100 的值是整数42,当使用自定义的脚本去获取时 ,其结果输出必须返回下面三行内容:
.1.3.6.1.4.100 integer 42
如果在获取某个oid的值时出现错误,那么脚本可以直接exit而无需向stdout输出任何的内容,net-snmp 的 snmpget 命令会自动产生noSuchName的错误。
PROG -s MIBOID TYPE VALUE — s 代表 set
当你执行 snmpset 命令时,自定义脚本的调用格式如上所述。TYPE就是指 integer, counter, gauge, timeticks, ipaddress, objid, string。如果脚本在获取信息时没有出错,无需向stdout输出任何内容,直接exit即可;否则,需要向 stdout 输出 not-writable 或者 wrong-type。
如何开启 pass 呢? 编辑 /etc/snmp/snmpd.conf 配置文件,加入如下类似的语句:
pass .1.3.6.1.4.1.2021.255 /bin/bash /home/rem1x/bin/passecho
其中的 oid 是由你自己选择的,passecho是自定义的Shell脚本,通过bash调用。
一个简单的Shell脚本模板:
#!bin/bash opt=$1 oid=$2 if [ "$opt" = "-g" ]; then do_the_snmpget ... echo $oid echo TYPE echo VALUE elif [ "$opt" = "-n" ]; then do_the_snmpgetnext ... echo $oid echo TYPE echo VALUE elif [ "$opt" = "-s" ]; then do_the_snmpset ... if_success, exit_directly if_fail, echo not-writable or wrong-type fi exit 0
转载请注明:爱开源 » net-snmp之利用pass做snmpget和snmpset