DigiLoog

PC関係の事なら何でもいけるそんな処

ZabbixのLLD自作してZFSプールを監視してみた

2022年12月25日(日) - 22:59 | カテゴリ: Linux

Zabbixは初期状態でも監視テンプレートが大量に用意されており、
初期テンプレでもサーバステータスやネットワーク機器のSNMPを叩いて監視出来る。
しかし、意外とファイルシステムのZFS監視が実装されていなかったりする。

LinuxでZFSを使う事は稀だし筆者の環境でも問題になっていなかった。
しかし、ProxmoxでRAIDっぽい事をしようとするとZFSを使う事となるので、
ディスクプールの空き容量を監視出来ないのが問題になった。

ずっと放置していたのだが、やる気と時間が復活したので調査。
Zabbixのローレベルディスカバリ(LLD)とユーザーパラメータ(UPs)で簡単に実装出来たので、
作り方をメモっておこうと思う。

ググればGitHubで公開している人もいるのだがシンプルにやりたかったので没にした。
今回は、自作したローレベルディスカバリを使ってZFSのプールパラメータを取得しつつ、
アイテム監視もユーザーパラメータに設定して動的制御している。

ローレベルディスカバリを自作する人は少ないと思うが実装は簡単で、
JSONでKEYとVALUEを出力させつつ、対象をユーザーパラメータに設定すれば取れるので、
コレを使ってZFSパラメータをぶっこ抜く様にしている。

 

  • LLDスクリプト

最初から地雷だが、Zabbixのバージョンによってローレベルディスカバリで読めるJSONが違う。
最近のバージョンではJSONに”data”としてキーを入れない様になっているので、
以前のバージョンで紹介している物は使えない。
筆者が利用している、Zabbix 6.2.0では次の様なJSONでデータを出力される必要があった。

スクリプトの出力結果を見やすくする為にjqコマンドで成形しているが、
Zabbixで読み込む時は改行やタブの字下げは不要でワンライナーでも解釈してくれる。

今回作成した、ZFSステータスを読み込んでJSONで出力するスクリプトは次の通り。
やっつけ感もあるが込み入った処理は不要なのでshellで書いてみた。

#!/usr/bin/bash

COUNT=0
COMMA=','
LENGTH=`zfs list -Hp -o name 2>/dev/null | wc -l`
COMMAND='zfs list -Hp -o name,type,mountpoint'

echo -n "["
if [ $LENGTH -le 0 ] ;then
    echo -n "{"
    echo -n "\"{#ZFSNAME}\":\"-\","
    echo -n "\"{#ZFSTYPE}\":\"-\","
    echo -n "\"{#ZFSMOUNT}\":\"-\""
    echo -n "}"
else
    $COMMAND | while read LINE; do
        ITEM=(`echo $LINE`)
        COUNT=$((COUNT + 1))
        [ $COUNT -eq $LENGTH ] && COMMA=''
        echo -n "{"
        echo -n "\"{#ZFSNAME}\":\"${ITEM[0]}\","
        echo -n "\"{#ZFSTYPE}\":\"${ITEM[1]}\","
        echo -n "\"{#ZFSMOUNT}\":\"${ITEM[2]}\""
        echo -n "}${COMMA}"
    done
fi
echo "]"

 

  • ユーザーパラメータ

ローレベルディスカバリのスクリプトと、
実際の監視ステータスを取得するコマンドをユーザーパラメータに登録する必要がある。
監視ステータスはZFSプール名と取得したい項目を引数にする事で設定を統一させる。
今回は、既存の”vfs.fs.discovery”の名前に合わせてみた。

UserParameter=zfs.fs.discovery,/etc/zabbix/zfs.fs.discovery.sh
UserParameter=zfs.fs.size[*],zfs get -Hp -o value "$2" "$1"

zfs.fs.discoveryがローレベルディスカバリ用のユーザーパラメータ、
zfs.fs.sizeがZFSプールの値を取得する設定となる。
しかし、この方法はセキュリティ度外視なので信頼できる対象サーバとZabbixのみで使う事。
使い方次第で第三者がRCE攻撃出来てしまうので、
不特定多数が使う環境ではスクリプトを介する様にしてサニタイジングをした方が良い。

 

  • ローレベルディスカバリ

通常のローレベルディスカバリと同様に設定すればスクリプトを実行してデータを取得出来る。
zabbix_getでも値を取れるので、丁寧にやるなら設定前にテストをした方が良い。

フィルター処理を入れれば、取得対象のLLDデータを間引く事が出来る。
サンプルスクリプトでは、ファイルシステムとしてマウントしているプールと、
ZFSのボリュームデータも取得する様にしているので、不要な物は削除した方がスッキリする。

 

  • アイテムのプロトタイプ

今回はローレベルディスカバリで監視対象を動的生成するので、
監視アイテムの作り方も通常とは違ってプロトタイプを設定する必要がある。

アイテムのプロトタイプ名にLLDで取得したZFSプール名を入れつつ、
キーにはZabbixから監視したい対象のデータを設定する。
ユーザーパラメータでアスタリスクを設定しているので、
括弧の中に設定した値はカンマ区切りで引数として渡す事が出来る。
こうする事で、ユーザーパラメータの設定を統一しつつZFSの各情報を取れる様になる。

………

後は好きな様にZFSの監視を組み込む。
筆者の環境では計算アイテムも併用してディスク使用率をパーセント表示出来る様にしてみた。
ここまでやる人はZabbixにも慣れている人だと思うので、各々のアイディアで乗り切れるはず。
ユーザーパラメータ監視は以前から実施していたが、
ローレベルディスカバリを自作しつつユーザーパラメータで取得するのは初めてなので勉強になった。





  • 応援中

    はじめるセカイの理想論 -goodbye world index-