Zabbix温度監視 No.05 SNMPで温度を取得する

ZabbixからSNMPでNW機器の温度を取得してみます。

■ヤマハルータ

とりあえず手元のRTX1200で試してみます。筐体温度はOID “.1.3.6.1.4.1.1182.2.1.15.0″で取得可能です。たしか全RT/RTXシリーズ共通だったはず。
snmpwalkをたたくとGauge32(整数)の数値が出力されるので、Zabbixサーバからはアイテムタイプ:SNMPv2エージェントを指定して温度を取得可能です。

# snmpwalk -v 2c -c community IPaddress .1.3.6.1.4.1.1182.2.1.15.0
YAMAHA-RT-HARDWARE::yrhInboxTemperature.0 = Gauge32: 46

※Zabbixのアイテム設定
rtx1200-temp

■NetApp

最近苦戦した温度を文字列で出力するタイプの機器の取得方法です。
温度は一応OID “.1.3.6.1.4.1.789.1.21.1.2.1.25.1″で取得可能なんですが、STRING(文字列)で出力され、複数の列が[,]で区切られ、摂氏と華氏の両方が表示されています。

# snmpwalk -v 2c -c community IPaddress .1.3.6.1.4.1.789.1.21.1.2.1.25.1
SNMPv2-SMI::enterprises.789.1.21.1.2.1.25.1 = STRING: "22C (71F) ambient, 28C (82F), 28C (82F), 33C (91F), 29C (84F), 33C (91F), 29C (84F), 34C (93F), 28C (82F), 34C (93F), 34C (93F), 35C (95F)"

これではZabbix側で温度として認識できません。そこでサーバのZabbixエージェントで、UserParameterとawk/sedによる整形を利用して間接的に温度を取得する方法を考えます。

やりたいことは以下の通り。

  • 複数の機器に対応すること
  • 「STRING: “」を含めた左側の文字55文字をカットすること
  • 列の区切り文字には「,」を指定し、それぞれの列を自由に指定可能なこと
  • 列の「C」より右側の文字は無視すること/

・・・という予定だったのです、awkで区切り文字を「,」に設定しようとすると、UserParameterの書式フォーマットの区切り文字「,」とバッティングしてしまいコマンドをうまく組み立てられませんでした。仕方ないので区切り文字は「 」(半角スペース)で区切ることにします。

# vi /etc/zabbix/zabbix_agentd.conf
UserParameter=NetApp.EnclTemp[*],snmpwalk -v 2c -c community $1 .1.3.6.1.4.1.789.1.21.1.2.1.25.1|sed -e "s/^.\{55\}//"|awk -F' ' '{print $$$2}'|sed -e 's/C.*//'

このコマンドならNetApp.EnclTemp[A,B]のAでIPアドレスを指定し、Bで列を指定できます。ただし華氏には対応できないので摂氏温度を取得ためには1/4/6/8・・・と指定することになります。

※Zabbixサーバのエージェントに設定したUserParameterを利用してNetAppの温度を取得する際のアイテム設定
netapp-temp

この設定が成功したら、アイテムのキーにNetApp.EnclTemp[NetAppIP1,4]、NetApp.EnclTemp[NetAppIP1,6]・・・・と続けるだけで全温度の取得が可能になります。
NetApp.EnclTemp[NetAppIP2,1]やNetApp.EnclTemp[NetAppIP3,1]とやれば、UserParameterへの追加1行で複数のNetAppの温度を取得することも可能になります。

コメント

  1. メタル より:

    Allied TelesisのデータをZabbixで取得しようとして、出力が文字列なので悩んでいました。
    この記事をみてなんとか取得できるようになりました。
    ありがとうございマイス。