フロッピーディスクの残骸

フロッピーディスクを分解するのって楽しいよね

ZabbixでKVMのpool-listの死活監視をする

pool-listは一言で言うとイメージの置き場所の一覧です。
例えば、KVMが動作する環境でvirsh pool-listというコマンドを打ち込むと
ストレージプールの現在の状態や自動起動設定はどうなっているかを確認できる。

[root@KVM]# virsh pool-list
 Name                 State      Autostart
-------------------------------------------
 aiueo                active     yes
 default              active     yes
 gomi                 active     no
 templates            active     yes

基本的には自動起動の設定をやるものだと思ってるんだけど、
何らかの原因(障害など)でストレージプールが起動ができなくなった場合がある。
今回は、これをZabbixで監視してみる。

ZabbixのUserParameterを利用する

Zabbixで事前に定義されていない監視をやりたい場合、自分でスクリプトを書いたりしなければならない。
そこで役立つのがUserParameterです。

KVMの監視は、Zabbixで事前に定義されていないものなので、
自分でスクリプトを書く必要があります。

まずはスクリプトを書く

下記のShellScriptを書きました。(virsh-pool-status.sh)

POOL_STATUSの行で、virsh pool-listから得られる情報をパースしています。

#!/bin/sh
READ_ARGUMENT=$1
if [ "${READ_ARGUMENT}" = "" ];then
    ERROR=`date +"%Y%m%d:%H%M%S "`${0}' :  empty argument $1'
    echo $ERROR
    exit
fi


POOL_STATUS=`sudo virsh pool-list | sed -e '1,2d' | sed -e 's/^ *//' | sed -e 's/ *$//' | sed -e 's/\s\+/,/g' | grep -w ${1} | cut -f2 -d ','`


ACTIVE="active"
DEAD="inactive"
if [ ${POOL_STATUS[${READ}]} = ${ACTIVE} ]; then
  echo 1
elif [ ${POOL_STATUS[${READ}]} = ${DEAD} ]; then
  echo 0
else
  echo ""
fi

1回目のsedで、1-2行目の不要な情報をカットします。
2,3回目のsed行前後の空白文字をカットし、 4回目のsedで複数の空白を,に置換しています。
(これは後から、得られる情報を取り出しやすくするためです) sedが終わった段階では下記のようになっているはずです。

# sudo virsh pool-list | sed -e '1,2d' | sed -e 's/^ *//' | sed -e 's/ *$//' | sed -e 's/\s\+/,/g'

aiueo,active,yes
default,active,yes
gomi,active,yes
templates,active,yes

あとは、grepで取り出すストレージプールを探して決めて、そこからcutコマンドで必要な列を抽出するだけです。
こんな感じで簡単に書くことができます。 POOL_STATUSより下の行はactive,inactiveの情報を0 or 1の情報に変換しているだけです。

ACTIVE="active"
DEAD="inactive"
if [ ${POOL_STATUS[${READ}]} = ${ACTIVE} ]; then
  echo 1
elif [ ${POOL_STATUS[${READ}]} = ${DEAD} ]; then
  echo 0
else
  echo ""
fi

ストレージプールを引数として渡して実行してみると10が帰ってくるはずです。

# sh virsh-pool-status.sh templates
1

スクリプトの配置と設定

スクリプト/etc/zabbix/virsh-pool-status.shとして配置し、実行権限をつけておきましょう。
また、大抵の環境ではvirshコマンドの実行はrootでやってますんで、zabbixユーザーにコマンドの実行権限を渡してやる必要があります。 visudoコマンドを使って設定を変更します。

Defaults:zabbix !requiretty
zabbix ALL = NOPASSWD: /bin/virsh

全部のコマンドの権限を渡すの必要は無いので、今回はvirshだけ渡します。

ユーザーパラメーターの定義

/etc/zabbix/zabbix_agentd.confに下記を追加しておきます。

UserParameter=virsh.pool_status[*],/etc/zabbix/virsh-pool-status.sh $1

これで設定は完了です。

ZabbixServerから値が取れるかチェックしてみる

]# zabbix_get -s IPADDR -k virsh.pool_status[templates]
> 1

ふう。とれたー。
あとは、Webからぽちぽちするだけですね。