Zabbix や munin のアラートを Pushover 経由でスマートフォンにプッシュ通知する

はじめに

この記事は昨年書いた「Zabbix のメディアタイプに Growl を指定し、手元のマシンの Growl で障害情報を受け取る方法」の焼き直しです。

こんにちは yosida95 です。 Pushover はスマートフォンにプッシュ通知を送ることに特化したサービスで、スマートフォンにレシーバーとなるアプリをインストールしておき、 REST API に通知内容を POST することで手軽にプッシュ通知を送れます。 類似サービスとしては im.kayac.com なんかが挙げられます。 IFTTT と連携させると最高便利です。

そんな Pushover を使って Zabbix や munin のアラートを手持ちのスマートフォンに通知してみようという試みです。

Zabbix

pushover_zabbix.py

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

import sys
import urllib2
from urllib import urlencode

APPTOKEN = YOUR_APPLICATION_TOKEN


def main():
    usertoken = sys.argv[1].strip()

    params = dict(
        token=APPTOKEN,
        user=usertoken,
        title=sys.argv[2],
        message=sys.argv[3])
    request = urllib2.Request(url='https://api.pushover.net/1/messages.json',
                              data=urlencode(params))
    urllib2.urlopen(request)
    return 0


if __name__ == u'__main__':
    sys.exit(main())
  1. zabbix_server.confAlertScriptsPath で指定したディレクトリに置く
  2. chmod で実行権限を与える
  3. Zabbix の Web コントロール画面からメディアタイプに指定する
  4. Pushover を使って通知を受け取りたい Zabbix ユーザーに、上記で追加したPushover メディアタイプを追加する
    • この時、送信先として Pushover のユーザートークンを指定する

より詳細な設定手順はZabbix のメディアタイプに Growl を指定し、手元のマシンの Growl で障害情報を受け取る方法を参照してください。

munin

contacts pushover
contact.pushover.command /path/to/pushover_munin.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import urllib2
from urllib import urlencode

APPTOKEN = YOUR_APPLICATION_TOKEN
USERTOKEN = YOUR_USER_TOKEN


def main():
    message = sys.stdin.read()

    params = dict(
        token=APPTOKEN,
        user=USERTOKEN,
        message=message)
    request = urllib2.Request(url='https://api.pushover.net/1/messages.json',
                            data=urlencode(params))
    urllib2.urlopen(request)
    return 0


if __name__ == u'__main__':
 sys.exit(main())
  1. pushover_mnin.py を munin がアクセスできるパスに munin がアクセスできる権限で設置する
  2. pushover_munin.py に実行権限を与える
  3. munin.conf に上記 2 行を追記する

おわりに

Zabbix pushover

写真のような通知が iPhone に飛んできて最高便利です。

以上です。 ありがとうございました。