Zabbix のメディアタイプに Growl を指定し、手元のマシンの Growl で障害情報を受け取る方法

はじめに

「サーバー監視をしていなくて許されてるのは小学生までですよね〜キャハハ」

私感ですが、 Munin と Zabbix のハイブリッド監視がステキです。

手順

Zabbix では、ある監視項目の値が閾値を超えるなどのイベントをトリガーに、その情報を監視者に通知することができます。 その通知方法として Zabbix にデフォルトで用意されている方法は、"メール", "Jabber", "SMS", そして"スクリプト"です。

Growl 通知を使うためには、この4つの通知方法のうち"スクリプト"を使用します。 つまり、"Growl で障害通知をするスクリプトを自分で書いて、ここに指定すればいいってワケ"です。

手順1. スクリプト

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

from gntp import notifier as growl


def main():
    user, password, hostname, port = reduce(
        lambda a, b: a + b,
        map(lambda a: a.split(u':'), sys.argv[1].split(u'@'))
    )

    notifier = growl.GrowlNotifier(
        applicationName=u'Zabbix',
        notifications=[u'zabbix'],
        defaultNotifications=[u'zabbix'],
        hostname=hostname,
        port=port,
        password=password
    )
    ret = notifier.register()

    if ret is True:
        notifier.notify(
            noteType=u'zabbix',
            title=sys.argv[2],
            description=sys.argv[3],
            # icon=u'[URI of ICON]',
            sticky=True,
            priority=-1
        )
    else:
        print ret


if __name__ == u'__main__':
    main()

こちらが予め用意した通知スクリプトです。

これを zabbix_server.conf の"AlertScriptsPath"に指定されているディレクトリに保存します。

なお、このスクリプトを動作させるためには gntp というライブラリが必要ですので、 pip または easy_install を使ってサクッとインストールしておいて下さい。 また、 virtualenv を使う場合は、適切に shebang を変更して下さい。

保存したら、 Zabbix の実行ユーザーが実行できるように、適切にオーナーやグループ, パーミッションを調整して下さい。

手順2. メディアタイプに追加する

Zabbix にログインした状態で、「管理」-> 「メディアタイプ」 -> 「メディアタイプの作成」と進み、フォームに適切な情報を入力し、 Zabbix メディアタイプを作成して下さい。

create-media-type

手順3. "Growl" メディアをユーザーに追加する

Zabbix にログインした状態で、「管理」 -> 「ユーザー」と進み、 Growl 通知を受け取りたいユーザーの設定画面を開きます。 ユーザー設定画面の下方に「メディア」という項目があるので、この項目の「追加」ボタンを押し、開いたフォームに適切な情報を入力し、 "Growl" メディアをユーザーに追加します。

add-media

なお、「送信先」のフォーマットですが、 "user:password@hostname:port" を想定しています。 user は不使用ですので空を、 password は通知を受け取るマシンの Growl 環境設定のネットワークタブで設定したものを、 hostname は通知を受け取るマシンのホストネームまたは IP アドレスを、 port は通知を受け取るマシンの Growl がリッスンしているポート番号を、それぞれ入力して下さい。

できた!

growl

ね、簡単でしょ?