雑な hinananoha

やさしいせかいをさがして三千里

IPMI搭載サーバのセンサーデータをHTTP API経由でZabbix監視する仕組みを作った話

TL;DR

github.com

以上

経緯とか

昨日は我が家のラックのうちネットワークの部分を見ましたが、サーバの部分はこんな感じになってます。

f:id:hinananoha:20210509203604j:plain
我が家のサーバラックの様子

このうち、下にある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

構成

構成は下図の通りです。

f:id:hinananoha:20210509202452p:plain
IPMI sensor over API の構成図

やってることは、
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の方を参照して下さい。

補足

本件、補足としては以下の通りです。

  • 今回、構築しやすさを取ってApache+wsgiをつかいましたが、Nginx+wsgiで構築することも可能です。その場合、別途systemdのunitファイルを作ったりする必要があったりとまあまあ面倒ですが……
  • 筆者の環境であるNEC Express5800ではローカルのIPMIでも全部取得するのに1分半くらいかかります(boot状態なども取得しようとするとこうなる)が、それでやると無事死にます。ですが、欲しいのは温度/Fan回転数/電圧なので、5秒~10秒くらいで取得を止めるといい感じになります。(timeout -s INT 5 ipmitools sensor list)

最後に

NEC Express5800でIPMI経由でデータを取得するとBMCが死ぬのはどうやら私だけでは無かったようなので、そう言う方にとって有用に使えることを祈っております。
あと、今回はHTTP Agentを使ったので大変面倒なことになりましたが、普通に監視対象からpy-zabbixとかを使ってアイテムの作成までやってしまった方が(テンプレートも不要で)楽だと思うのでそのうちそっちも作ります。そのうちね。

*1:なお、その後別件でPythonをつかってZabbixトラッパーによるセンサ起点のデータ送信方法を見つけたわけですが、今回はその前、ということで……