Net-SNMPで外部コマンドの結果を返すときに、そのMIBを固定したいの

Nagiosリモートホストのリソース監視なんかには、NRPEではなくて、どのみち上げているsnmpd(Net-SNMP)を使っています。予め指定しておいたコマンドの結果をSNMPでゲットできるようにして、それを check_snmp で監視するようにしているわけです。

Net-SNMPで外部コマンドの結果を返すのにはこんな感じでexecやshを使っていたのですが、

# snmpd.conf
exec   omikuji /usr/games/fortune
sh     lunch   [ $(($(date "+%s") % 2)) -eq 0 ] && echo curry || echo gyoza
$ snmpwalk -v 1 -c public localhost extTable
UCD-SNMP-MIB::extIndex.1 = INTEGER: 1
UCD-SNMP-MIB::extIndex.2 = INTEGER: 2
UCD-SNMP-MIB::extNames.1 = STRING: omikuji
UCD-SNMP-MIB::extNames.2 = STRING: lunch
UCD-SNMP-MIB::extCommand.1 = STRING: /usr/games/fortune
UCD-SNMP-MIB::extCommand.2 = STRING: [
UCD-SNMP-MIB::extResult.1 = INTEGER: 0
UCD-SNMP-MIB::extResult.2 = INTEGER: 0
UCD-SNMP-MIB::extOutput.1 = STRING: Life is to you a dashing and bold adventure.
UCD-SNMP-MIB::extOutput.2 = STRING: curry
UCD-SNMP-MIB::extErrFix.1 = INTEGER: noError(0)
UCD-SNMP-MIB::extErrFix.2 = INTEGER: noError(0)
UCD-SNMP-MIB::extErrFixCmd.1 = STRING:
UCD-SNMP-MIB::extErrFixCmd.2 = STRING:

$ snnmpget -v 1 -c public localhost UCD-SNMP-MIB::extOutput.2
UCD-SNMP-MIB::extOutput.2 = STRING: curry

これだとホストによってexec、shの定義が異なっている(あったりなかったり、順番が違ったりする)と、同じ種類の値なのにホストによってMIBが変わってしまい(末尾のインデックスの数字)扱いづらいなーと常々思っていました。(文法上、execやshの後にOIDの指定ができますが、今やこれはdeprecatedとされています。 http://www.net-snmp.org/docs/man/snmpd.conf.html#lbBA)

そんな折、[twitter:@kazeburo] さんが、「なういsnmpdはMIBの固定参照ができるにょ」と言っていたので、ちと調べてみました。

Net-SNMPの5.2ぐらいから extend というのが使えるようなのですが、これを使い、こういう設定をすると、

# snmpd.conf
extend harahetta  /bin/bash -c '[ $(($(date "+%s") % 2)) -eq 0 ] && echo curry || echo gyoza'

こんな感じで固定的なMIBで参照できました。

$ snmpwalk -v 1 -c public localhost NET-SNMP-EXTEND-MIB::nsExtendOutputFull
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."lunch" = STRING: curry
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."omikuji" = STRING: Never commit yourself!  Let someone else commit you.
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."harahetta" = STRING: curry

$ snmpwalk -v 1 -c public localhost 'NET-SNMP-EXTEND-MIB::nsExtendOutputFull."harahetta"'
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."harahetta" = STRING: gyoza
$ snmpwalk -v 1 -c public localhost NET-SNMP-EXTEND-MIB::nsExtendObjects
NET-SNMP-EXTEND-MIB::nsExtendNumEntries.0 = INTEGER: 3
NET-SNMP-EXTEND-MIB::nsExtendCommand."lunch" = STRING: [
NET-SNMP-EXTEND-MIB::nsExtendCommand."omikuji" = STRING: /usr/games/fortune
NET-SNMP-EXTEND-MIB::nsExtendCommand."harahetta" = STRING: /bin/bash
NET-SNMP-EXTEND-MIB::nsExtendArgs."lunch" = STRING: $(($(date "+%s") % 2)) -eq 0 ] && echo curry || echo gyoza
(snip)

というか、試したNet-SNMP 5.4.1では、execやshで定義したのもnsExtend*なMIBに出てきてますね! 知らなんだ!