IPMI搭載サーバのセンサーデータをHTTP API経由でZabbix監視する仕組みを作った話
経緯とか
昨日は我が家のラックのうちネットワークの部分を見ましたが、サーバの部分はこんな感じになってます。
このうち、下にあるHPE ProLiant DL380p Gen8はESXiなのですが、上にあるNEC Express5800(ここでZabbix Serverが動いている)と更に上の A.T.Works QuadBeagle ZG+は物理Ubuntu Serverとして稼働しています。
さて、我が家ではZabbixにて諸々監視をしようと試みているのは先日お話ししましたが、我が家で動いている物理Ubuntu ServerをZabbixで監視するにあたり、以前より以下の問題がありました。
- lm_sensorsをつかって監視したいのに、
- 温度しか拾ってこない
- 拾ってきてる温度の値もおかしい
- ではIPMIで、とやろうとすると、
- 要求が多すぎるせいか、BMCが落ちる(NEC Express5800)
この状況でどうにか温度/ファン速度を監視できないかと模索したところ、以下の結論にたどり着きました。
1. ローカルでIPMIを取得するコマンドを叩く
2. その結果を何らかの方法でZabbixに送る
3. みんなHappy
今回は、Zabbixからサーバにデータを取得しに行くこととし、取得方法はHTTPエージェント、そのため監視されるサーバ側にセンサのデータをJSONでいい感じに返すHTTP APIを構築することにしました。*1
構成
構成は下図の通りです。
やってることは、
1. 監視対象のサーバ上で ipmitools sensor list コマンドを実行し、その結果をファイルに書き出すのを1分毎に行うcronを挿入する
2. Apache + wsgiなWebサーバを構築し、APIはflask-restfulをつかって受け付ける
3. メインのPythonスクリプトでは、要求があったら1. のファイルを読み込んでparseしてjsonファイルとして応答する
4. HTTPエージェントを使ってjsonを受取り、そのデータをベースにLLDでアイテムを作るZabbix Templateを適用し、1分に1回このAPIにデータを取得しに行く
という感じです。
Githubで公開したコードにはこのうち、
が格納されています。
具体的な構築方法はGithubの方を参照して下さい。
補足
本件、補足としては以下の通りです。
最後に
NEC Express5800でIPMI経由でデータを取得するとBMCが死ぬのはどうやら私だけでは無かったようなので、そう言う方にとって有用に使えることを祈っております。
あと、今回はHTTP Agentを使ったので大変面倒なことになりましたが、普通に監視対象からpy-zabbixとかを使ってアイテムの作成までやってしまった方が(テンプレートも不要で)楽だと思うのでそのうちそっちも作ります。そのうちね。