前回の記事では、自宅NAS(RAID構成のストレージ)をSMARTで監視する際の諸事情についてまとめた。
本稿ではテンプレートと設定ファイルを具体的に示し、Zabbixでどのように監視するかを説明する。
条件
前回の記事の続きではあるが、一応条件を掲げておく。
- 対象NASはQNAPのTS-451、TS-453Be
- いろいろググっているとQNAPは製品(たぶんCPU)ごとに微妙にOS仕様が違うらしいので、他機種では動かないかもしれない
- Zabbix 5.xで試しているが、たぶん4.x以降なら大丈夫と思う
- QNAPがコマンドライン操作をでどこまで製品サポートしているかはよく分からない(まじめに保証書を読んでいない)ので、自己責任でお願いしたい
Zabbix Templateを作るにあたっての方針
これからやろうとしているのは、QNAP上のディスクドライブのSMART情報およびRAID状態の取得だ。それぞれデバイス名がついているのだが、その名前は一意ではない可能性があり、カスタマイズ(指定)可能なようにしたい。たとえばドライブ数は変動する可能性がある(sda、sdb…sdfのようになり得る)。またRAIDのデバイス名もmd1、md2…のように複数になり得る(たぶん。自分では複数ボリュームを作成したことがない)。
このようなケースでは、ZabbixはLLD (Low Level Discovery)を使えという方針だ。以前はpositional macro($1, $2… $9)というのが使えて簡単だったのだが、Zabbix4.x以降で廃止されてしまった。LLDは自由度が高くて素晴らしいのだが、監視対象にいろいろ仕込まないといけない。回避方法を調べてみたが、うまい手がないのでやむを得ず正攻法(?)で行くことにする。
discovery keyの作成
まずディスクドライブのdiscovery keyを作成する。SMART情報が欲しいのはRAIDを構成しているディスクのデバイス名だ。それは/proc/mdstat
にリストアップされている。
[admin@oliphaunt ~]# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath]
md1 : active raid5 sdc3[0] sdb3[3] sda3[2] sdd3[1]
23412214272 blocks super 1.0 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
md322 : active raid1 sdb5[3](S) sda5[2](S) sdd5[1] sdc5[0]
7235136 blocks super 1.0 [2/2] [UU]
bitmap: 0/1 pages [0KB], 65536KB chunk
md256 : active raid1 sdb2[3](S) sda2[2](S) sdd2[1] sdc2[0]
530112 blocks super 1.0 [2/2] [UU]
bitmap: 0/1 pages [0KB], 65536KB chunk
md13 : active raid1 sdc4[0] sdb4[3] sda4[2] sdd4[1]
458880 blocks super 1.0 [32/4] [UUUU____________________________]
bitmap: 1/1 pages [4KB], 65536KB chunk
md9 : active raid1 sdc1[0] sdb1[3] sda1[2] sdd1[1]
530048 blocks super 1.0 [32/4] [UUUU____________________________]
bitmap: 1/1 pages [4KB], 65536KB chunk
unused devices: <none>
md##で始まる行の、5カラム目以降にデバイス名が並んでいる。これらをピックアップしてuniqすればよいようだ。awkを使ってUserParameterを書くとこうなる。JSONで出力しなければならないのであまりスマートではないが。
UserParameter=vfs.dev.smart.discovery,awk '/^md/ { for (i = 5; i <= NF; i++) print substr($i,0,3) }' /proc/mdstat | sort | uniq | awk 'BEGIN { printf "["; f = 0 } { if (f) print ","; f = 1; printf "{\"{#DEVNAME\}\":\""$1"\"}" } END { print "]" }'
RAIDのデバイス名も、同じ/proc/mdstat
から生成できる。awkで書けばこうなる。
UserParameter=vfs.dev.raid.discovery,awk 'BEGIN { printf "["; f = 0 } /^md/ { if (f) print","; f = 1; printf "{\"#DEVNAME}\":\""$1"\",\"{#DEVTYPE}\":\""$4"\"}" } END { print "]" }' /proc/mdstat
このリストアップでは、監視したくないディスクやRAIDグループもピックアップしてしまうかもしれない。そのときはdiscovery ruleでfilterを書けるので、Hostごとに設定してやればよい。
UserParameterファイルの設置
discovery ruleと、前回の記事で示した各種パラメータ取得エントリはこれで十分と思われるので、具体的に設定ファイルをQNAPに設置してみよう。SMARTとRAIDは別のテンプレートに分けるので、confも別に分けておく。まずはsmart.conf
を示す。
UserParameter=vfs.dev.smart.discovery,awk '/^md/ { for (i = 5; i <= NF; i++) print substr($i,0,3) }' /proc/mdstat | sort | uniq | awk 'BEGIN { printf "["; f = 0 } { if (f) print ","; f = 1; printf "{\"{#DEVNAME\}\":\""$1"\"}" } END { print "]" }'
UserParameter=hdd.smart[*],sudo /usr/sbin/smartctl -d ata -A /dev/$1 | grep $2 | awk '{ print $$10 }'
次にraid.conf
。
UserParameter=vfs.dev.raid.discovery,awk 'BEGIN { print "["; f = 0 } /^md/ { if (f) print","; f = 1; printf "{\"{#DEVNAME}\":\""$1"\",\"{#DEVTYPE}\":\""$4"\"}" } END { print "]" }' /proc/mdstat
UserParameter=raid.state[*],if sudo mdadm -D /dev/$1 | grep -q 'State :.*degrade'; then echo 0; else echo 1; fi
UserParameter=raid.failed[*],sudo mdadm -D /dev/$1 | awk '/Failed Devices/ { print $$NF }'
UserParameter=raid.active[*],sudo mdadm -D /dev/$1 | awk '/Active Devices/ { print $$NF }'
UserParameter=raid.working[*],sudo mdadm -D /dev/$1 | awk '/Working Devices/ { print $$NF }'
この2つのファイルを/opt/ZabbixAgent/etc/zabbix_agentd.conf.d
に保存する。前回の記事でも注意したが、zabbix_agentd.conf
にはIncludeが定義されていないので
Include=/opt/ZabbixAgent/etc/zabbix_agentd.conf.d/
を追記しておくのを忘れないようにしていただきたい。さもないと何度再起動しても読み込んでもらえない。
もうひとつ、zabbixプロセスがroot権限でコマンドを実行できるように/usr/etc/sudoersに次の2行を追加する。
zabbix ALL=(ALL) NOPASSWD: /usr/sbin/smartctl -d ata -A /dev/sd?
zabbix ALL=(ALL) NOPASSWD: /sbin/mdadm -D /dev/md*
ここまでできたらQNAPでZabbix-agentを停止→開始する。無事に起動した(ようにみえた)ら、サーバからdisvoery ruleが動作しているかを確認する。JSONが正しく帰ってきているかをチェックする。
[north@xorn ~]$ zabbix_get -s oliphaunt -k vfs.dev.smart.discovery | jq .
[
{
"{#DEVNAME}": "sda"
},
{
"{#DEVNAME}": "sdb"
},
{
"{#DEVNAME}": "sdc"
},
{
"{#DEVNAME}": "sdd"
}
]
[north@xorn ~]$ zabbix_get -s oliphaunt -k vfs.dev.raid.discovery | jq .
[
{
"{#DEVNAME}": "md1",
"{#DEVTYPE}": "raid5"
},
{
"{#DEVNAME}": "md322",
"{#DEVTYPE}": "raid1"
},
{
"{#DEVNAME}": "md256",
"{#DEVTYPE}": "raid1"
},
{
"{#DEVNAME}": "md13",
"{#DEVTYPE}": "raid1"
},
{
"{#DEVNAME}": "md9",
"{#DEVTYPE}": "raid1"
}
]
テンプレートの作成と設定
discovery ruleが動けばTemplateを作成しHostに設置できる。ここからはZabbixのGUIでの手順を示すより、XMLファイルをimportしてもらった方が楽なのでそれで済ませたい。GitHubはこちら。
QNAPで作成したRAIDボリュームだが、自分で作成したボリューム以外にもシステム領域と思われるデバイス名がリストアップされる。これらはなぜかdegraded modeで動作していたりするので最初から除外しておきたい。今のところどのデバイスがシステム予約なのか確信がないので、どれを自分で監視対象にするかをマクロで指定していただきたい。具体的にはmd1
だけ監視対象にするときは、Hostの設定で{$VFS.DEV.RAID.DISCOVERY.MATCHES}
というマクロを指定する。
マクロでは正規表現が使えるので、複数ドライブでも指定可能だ。たとえばmd[0-5]$
のようなパターンが使えると思う。
トリガと発報
トリガは以下の通り。
- SMART情報は監視項目のうち1つでも0を超えたらHighを返す。間隔は1時間
- RAIDがdegradeしたらDisasterを返す。間隔は5分
High、Disasterに対してどのような通知をするかは各位で設定していただきたいが、以前の記事に示した通りSMARTが異常値を示したら少なくとも1か月以内のディスク交換をお勧めする。それからもちろん、RAIDがdegradeしたら直ちに対応が必要だ。