Zabbixで拡張MIB情報を取得する

Zabbixを使ってSNMP情報を取得するとき、OIDを指定することになる。

標準MIBを例にすれば、

インタフェースで受信したパケットの総バイト数

を取得しようとする場合、OIDは、.1.3.6.1.2.1.2.2.1.10 となるが、代わりに IF-MIB::ifInOctets と指定することが出来る。

なぜこんなことが出来るかというと、

/usr/share/snmp/mibs/IF-MIB.txt

の中に

IF-MIB DEFINITIONS ::= BEGIN

(省略)

ifInOctets OBJECT-TYPE
 SYNTAX Counter32
 MAX-ACCESS read-only
 STATUS current
 DESCRIPTION
 "The total number of octets received on the interface,
 including framing characters.

Discontinuities in the value of this counter can occur at
 re-initialization of the management system, and at other
 times as indicated by the value of
 ifCounterDiscontinuityTime."
 ::= { ifEntry 10 }

の記述があるからである。下記コマンドにて検証することが出来る。

$ snmptranslate -On IF-MIB::ifInOctets
.1.3.6.1.2.1.2.2.1.1

監視対象とするネットワーク機器の拡張MIB情報を監視対象とする場合、MIBファイルを入手し、Zabbixサーバ上の /usr/share/snmp/mibs/ にMIBファイルをコピーしておけば、OIDを調べなくても上記のように設定することが出来る。

下記にYAMAHA RTX1210の例を示す。

RTXシリーズのMIBは、http://www.rtpro.yamaha.co.jp/RT/docs/mib/ よりダウンロードできる。yamaha-private-mib.tar.gz 等を入手し、解凍の上、

/usr/share/snmp/mibs/ へコピーする。

$ snmptranslate -On YAMAHA-RT-HARDWARE::yrhInboxTemperature
.1.3.6.1.4.1.1182.2.1.15

と変換されるようであれば、Zabbix上でSNMP OID指定する際には、

.1.3.6.1.4.1.1182.2.1.15 の代わりに YAMAHA-RT-HARDWARE::yrhInboxTemperature が利用できるということになる。

参考サイト)
追加Mibを読み取らせる方法(Ver3.0)
第5回 図解で知るSNMP――MIB情報のすべて
【NET-SNMP】ベンダーMIBファイル追加設定
ネットワーク機器のSNMP MIB/OIDまとめ

ZabbixでHDDのS.M.A.R.T.を監視

ZabbixでHDDのS.M.A.R.T.を監視してみるを参考に設定してみた。
ハードウエアRAIDでミラーリングされているディスクは監視できなかったが、SATAで接続しているディスクは監視できた。
4.Zabbixエージェントにユーザパラメータを設定する の箇所は、
UserParameter=hdd.smart[*],smartctl -A /dev/$1 | grep $2 | awk ‘{print $$10}’
ではなく
UserParameter=hdd.smart[*],sudo smartctl -A /dev/$1 | grep $2 | awk ‘{print $$10}’
とすることで値を取得できるようになる。
ただ、1点気になる点がある。zabbix_agentd.confには、

### Option: UnsafeUserParameters
# Allow all characters to be passed in arguments to user-defined parameters.
# The following characters are not allowed:
# \ ‘ ” ` * ? [ ] { } ~ $ ! & ; ( ) < > | # @
# Additionally, newline characters are not allowed.
# 0 – do not allow
# 1 – allow
#
# Mandatory: no
# Range: 0-1
# Default:
# UnsafeUserParameters=0

があり、*を使うなら、UnsafeUserParameters=1にしないといけない記述があるが、0でも動作している。
バグなのか、英語の語学力が足りないかのどちらかかなぁ?

ZabbixでIPMIを使用したハードウエア監視について

DELLのサーバと言えば、iDRAC (デルリモートアクセスコントローラ)というもので昔はload averageが高くなりすぎてサーバが制御できなくなったの再起動に使用したり、ハードウエア情報を監視したりしていたが、今ではIntelligent Platform Management Interface (IPMI) という、標準化されたメッセージ・ベースのハードウェア管理インターフェースがあることを最近知った。
BMCという方式で実現されており、サーバ本体のIPアドレスとは別のアドレスを設定することで、iDRACがなくても、ipmitoolを使うことでサーバの再起動やハードウエアリソースを取得することが出来る。
「標準化された」というところがポイントで、サーバのメーカーが違っていても対応できるところが最大のメリットで、昔の記事ではYahoo JapanでもIPMIでの大規模サーバー管理をしていることが掲載されている。
ZabbixでIPMIアイテムを取得する方法は、Zabbix2.0.4でIPMIアイテムを収集する。 #Zabbix #自宅ラック勉強会が大変参考になる。
SoftLayer上でZabbixを動かしエージェントの自動登録やAuto Scaleとの連携を行うもハードコピーが多く非常に分かりやすい。
単位がdiscrete のセンサーの値はZabbixで非対応 という点がポイントで、ほとんどの値が取れないのはZabbixのバージョンアップを期待するしかない。
Zabbixを使ってIPMI監視(HP iLO編)で紹介されているように、ipmitoolを駆使して外部チェックすればほかの値も監視できるのかとは思うが、やっていない。。。。
ところで、ipmitoolでZabbixからハードウエア監視をしようと試してみたところハマったポイントがあったので紹介しておく。
ハマったこと1)Destination Host Unreachableで切り分けに手こずる
ローカル(-I lan -U -H オプションを指定しない)からは取得できるのに、BMCに設定しているIPアドレス宛では
No response from remote controller
Get Auth Capabilities command failed
Error: Unable to establish LAN session
と表示されてしまうという事象だ。
結論としては、Zabbix監視サーバ(ipmitoolで監視対象となっているサーバとは別)からは通信ができるので問題なく、
切り分けしようとしてハマったというオチなのだが、ipmitoolを実行しているサーバと同一サーバで設定しているIPアドレスは同一セグメントなのに
Destination Host Unreachable
となる。。。
これは仕様なのかもしれない。
ハマったこと2)IPフィルタリングで手こずる
623/udpなのだが、UDPパケットだけに戻りパケットをちゃんと通してあげる必要がある。
戻りパケットはdestination portが631ではなくsource portが631なので注意!
destination portが631だと勘違いしてこれまた手こずりました。。。。
参考)
BMC: 業界標準のシステム管理コントローラ
ipmitool のリモート操作に必要な設定
ホストOSのLinux側で、筐体のBMC(IPMI)に設定されているIPアドレスを調べる
ZABBIX Forums IPMI監視のセンサーについて
ZABBIX Forums IPMI Discrete Sensors

Rasberry Pi 2で定期的に温湿度センサーの情報を送信する

/etc/crontabと/etc/cron.d設定ファイルの書き方を参考にプログラムの実行をスケジュール化する。
/etc/cron.d/send_temp
と登録し、下記を保存する。
#8~17時を除いた6~23時に毎時0時に送信する
0 6-7,18-23 * * * pi /home/pi/iot_source/send_temp.py 12> /home/pi/debug.txt
#土日は8~17時も毎時0時に送信する
0 8-17 * * 0,6 pi /home/pi/iot_source/send_temp.py 12> /home/pi/debug.txt
#5分ごとにセンサデータを収集する
*/5 * * * * pi /home/pi/iot_source/get_temp.py 12> /dev/null

Rasberry Pi 2で温湿度センサーの情報をZabbixサーバに送信する

Rasberry Pi 2で収集した情報をZabbixサーバに送信するためには大きくは2つの方法がある。
・Zabbixエージェントをインストールしてデータを送信(サーバから見ると収集)する方法(パッシブチェックとアクティブチェックというデータの収集のトリガーが異なる2つの方式がある。詳しくはこちら
・zabbix_senderコマンドを利用してデータをサーバに送信する方法
前者の方式は、エージェントを利用するので、サービスを常に起動しておかなければならないということと、ポートを待ち受けしないといけないことから、IoTディバイスとして節電して長く使いたい要求と、セキュリティを担保したい(エージェントの脆弱性によって問題が起こり得るか、DoS攻撃の対象になりうる)ことから後者を採用することにした。
ただ、zabbix_senderはRasberry Pi2を動かしているRaspianOSではちょっと導入が面倒。
Zabbix Server側の設定はこちらを参考にしてみるとよい。
これから始めるZabbix Sender(2) Raspberry Pi の温度データを送るには?
作成したソースはこんな感じ
配列に一度格納してまとめて1回のコマンドで実行することで通信回数を減らしてみた。
#!/usr/bin/env python
import RPi.GPIO as GPIO
import dht11
import time
import subprocess
from datetime import datetime
now=time.time()
Zabbix_Server=”(ZabbixサーバのIPアドレス)”
Host_Name=”(Zabbixサーバに登録したホスト名)”
#Zabbixサーバに下記アイテムを2つ登録している必要がある
Temp_KeyName=”sender_temperature”
Humi_KeyName=”sender_humidity”
#define GPIO 14 as DHT11 data pin
Temp_sensor=14
try:
GPIO.setmode(GPIO.BCM)
instance = dht11.DHT11(pin = Temp_sensor)
while not ‘result’ in locals() or result.humidity==0:
result = instance.read()
if result.is_valid():
print(“Tem:”+str(result.temperature)+” C Hum:”+str(result.humidity)+”%”)
send_data = []
send_data.append(Host_Name + ” ” + Temp_KeyName + ” ” + str(int(now)) + ” ” + str(result.temperature))
send_data.append(Host_Name + ” ” + Humi_KeyName + ” ” + str(int(now)) + ” ” + str(result.humidity))
check = subprocess.check_call(‘echo “‘ + “\n”.join(send_data) + ‘” | zabbix_sender -z ‘ + Zabbix_Server + ” -T -i -“, shell=True)
except KeyboardInterrupt:
pass
finally:
print check

Rasberry Pi 2で温湿度センサーの情報をZabbixで収集する

こんなケースに入れて、
蓋なし.jpg
穴をあけた蓋を付けて、
蓋つき.jpg
温室に取り付けると
取り付け.jpg
こんな感じで温室の温湿度が取得できる。
らずぱい温湿度センサー.png
これをやる為の方法を今後掲載していくことにする。
実現するために必要な材料
Raspberry Pi2
・無線LANアダプタ(余っていた WLI-UC-G を使用)
・温湿度センサー(DHT11センサー を使用。誤差が大きいので、気休め程度。気になる場合にはもう少し精度のよいものがよいかも?)
・リチウムイオンバッテリー(Anker PowerCore 10000)
・電子レンジであっためられるタッパー
・Zabbixサーバ(Cloudnで実現)
実現した結果として
・Raspberry Pi2はバッテリーからでも起動できる
・意外に電源を食うので、省電力対策は欠かせない
 →無線LAN通信を極力減らす必要がある。
今後したいこと
・電源のシャットダウン方法を確立する か バックアップをとる。
・Raspberry Pi2ではなく、Raspberry Pi Zero Wでやりたい。(さらに省電力にしたい)

Zabbixでヤマハルータの温度を取得する

Zabbix温度監視 No.05 SNMPで温度を取得するを参考に
N1200(RTX1200)の温度監視してみることにチャレンジした。
しかし、 No Such Object available on this agent at this OID と怒られて取得に失敗してしまう。
SNMP OID欄にOIDである .1.3.6.1.4.1.1182.2.1.15.0 とすべきところを .1.3.6.1.4.1.1182.2.1.15 としていたことが原因。
代わりに SNMPv2-SMI::enterprises.1182.2.1.15.0 とすることでも正しく取得できる。
OIDは正確に登録しましょう!
$ snmpwalk -v 2c -c (コミュニティ名) (IPアドレス) .1.3.6.1.4.1.1182.2.1.15
SNMPv2-SMI::enterprises.1182.2.1.15.0 = Gauge32: 44
$ snmpwalk -v 2c -c (コミュニティ名) (IPアドレス) SNMPv2-SMI::enterprises.1182.2.1.15.0
SNMPv2-SMI::enterprises.1182.2.1.15.0 = Gauge32: 44