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に出てきてますね! 知らなんだ!