斎藤です。こんにちは。
今日は、社内の業務自動化に際して書いた、 Nagios の status.dat をパースする Python ライブラリご紹介します。
Nagios のステータスを別のプログラムから確認する
Nagios の監視状況を他のプログラムから確認しようとした場合、大きく分けて次の2つの方法があります。
- 管理画面のHTML をスクレイパーを使って読む
- stauts.dat を読む
1は、疎結合ではありますが、スクレイパーを使うとなるとパースが面倒なのは自明です。
2は、 Nagios が自分自身の監視状況を管理するために生成している status.dat を読みます。1に比べたら、HTMLのパースほど複雑ではないので、開発者への負担が少なそうです。
ただ、2の方法でパースする方法はいくつかネット上にやり方があったものの、どうもしっくり来るものが無かったため、自分で書く事にしました。
ソースコード
こちらからどうそ。
データ構造
parseStatus.dat.py 唯一のメソッドである parseFile() を呼んだ際に、第二引数"result"に渡されるdict形式の値は次の構造になっています。
主に使うのは「host」と「service」の項目になるかと思います。
result = {
"info" => {
"created" = ?,
"version" = ?
},
"program" => {
[VALUE1] = ?,
[VALUE2] = ?,
:
[VALUEn] = ?
},
"host" = {
[HOST1] => {
[VALUE1] = ?,
[VALUE2] = ?,
:
[VALUEn] = ?
},
[HOST2] => {
(HOST1と同じ)
},
:
[HOSTn] => {
(HOST1と同じ)
}
},
"service" => {
[HOST1] => {
[SERVICE1] = {
[VALUE1] = ?,
[VALUE2] = ?,
:
[VALUEn] = ?
},
[SERVICE2] = {
(SERVICE1と同じ)
},
:
[SERVICEn] = {
(SERVICE1と同じ)
},
},
[HOST2] => {
(HOST1と同じ)
},
:
[HOSTn] => {
(HOST1と同じ)
}
}
}
注意点として、全ての値は「文字列」として保存されています。従って、見た目は数値のものでも、文字列として評価する必要があります。
よく使いそうな値
Nagiosが監視時に記録している情報がいくつもあるのですが、そのうち私なりに「これはよく使いそうだ」と考えたものをピックアップしてみます。
- current_state = "0": 正常, "1": WARNING, "2": CRITICAL, "3": UNKNOWN
- notifications_enabled = "0" or "1"
- active_checks_enabled = "0" or "1"
- passive_checks_enabled = "0" or "1"
- acknowledgement_type = "0" or "1"
- performance_data = (Pluginが返した結果)
変数の説明は...名前の通りなので省略します。値は、0 or 1 の場合、0がFalse、1がTrueです。その他は、変数に付記した通りです。
実際に参照する時は、このように行います。ここでは、ホスト名を仮に "vm001"、サービス監視項目名を "disk_sda1" とします。
- ホスト: value = result[ "host" ][ "vm001" ][ "current_state" ]
- サービス: value = result[ "host" ][ "vm001" ][ "disk_sda1" ][ "notifications_enabled" ]
全部を取得したい場合は、forを用いて回せば良いかと思います。
最後に
ここまで、Nagios の status.dat をパースする Python ライブラリをご紹介しました。
なお、 status.dat に保存されていない主な情報として「サービスグループ」と「ホストグループ」があります。もちろん、このソースでもパースする事ができません。ご注意ください。
このライブラリが、 Nagiosの監視データを用いてツールを作られたい方のお役に立てば幸いです。
それでは、ごきげんよう。