ホーム » 技術 » QNAPストレージをZabbixで監視する

QNAPストレージをZabbixで監視する

前回の記事では、自宅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したら、当然のことながら直ちに対応が必要だ。

参考リンク