Zabbix のアラートを Android にプッシュ通知するおはなし

これでろくにメールをみないやままくんもすぐに異常に気づけます。

環境

サーバ

クライアント

プッシュ通知には Notify My Android を使用します。有料(生ビール1杯分くらい)ですが、買っとくといろいろ便利です。

Zabbix の通知スクリプトをつくる

今回は Ruby をつかって Notify My Android(以下 NMA)のAPI を叩きます。Zabbix から Ruby を直叩くといろいろめんどくさいので、シェルスクリプトから Ruby を叩くとかいう頭のわるいことをします。
ほんとはシェルスクリプトからでも API 叩けると思うんですけど、NMA のサイトにあったシェルスクリプトのサンプルのインデントがひどくてやる気なくなりました。

シェルスクリプト

# vi /var/lib/zabbixsrv/alertscripts/notify-my-android.sh
------
#!/bin/bash

# initialize rbenv
. /etc/profile.d/rbenv.sh

cd /var/lib/zabbixsrv/alertscripts/notify-my-android.sh
bundle exec ruby script.rb "$1" "$2" "$3"
------

Zabbix は引数で情報を渡してくれるので、これを Ruby スクリプトに渡します。いみわからん。

  • $1: To
  • $2: Subject
  • $3: Message

当然ですがスクリプトは Zabbix さんに権限がないとつかえないので、パーミッションとかを変更します。

# chmod +x notify-my-android.sh
# chown zabbix. notify-my-android.sh

Ruby スクリプト

Ruby から NMA の API を叩く gem があるのでそれをつかいます。グローバルにいれたくないので Bundler をつかったらややこしいことになりました。

# mkdir notify-my-android && cd notify-my-android

# bundle init
# vi Gemfile
------
source "https://rubygems.org"
gem "ruby-notify-my-android", "= 0.4.3"
------
# bundle --path vendor/bundle

# vi script.rb
------
require "ruby-notify-my-android"

NMA.notify do |n|
  n.apikey      = ARGV[0]
  n.application = "Zabbix"
  n.event       = ARGV[1]
  n.description = ""
end
------

# cd ../
# chown -R zabbix. notify-my-android

Zabbix の設定をするときに、Send to に NMA の API キー をいれとくと(後述)シェルスクリプト経由で Ruby スクリプトにそれが渡ります。渡された API キーをつかって Ruby から NMA の API を叩きます。いみわからん。

Zabbix にスクリプトを登録する

Administration -> Media types からメディアをつくります。

  1. Create media type をクリック
  2. こんな感じのをつくる
    • Description: Notify My Android
    • Type: Script
    • Script name: notify-my-android.sh

ユーザにメディアを登録する

Administration -> Users からよしなに設定したいユーザのページをひらきます。

  1. Media タブ -> Add
  2. こんな感じのをつくる
    • Type: Notify My Android
    • Send to: [NMA の API キー]

アクションをつくる

Configuration -> Actions からアクションをつくります。

  1. Create action をクリック
  2. こんな感じのをつくる。スクリプトみるとわかるけど実は Message 使ってないからそのへんの設定はどうでもいい
    • Action
      • Name: Report problems using notify my android
      • Default subject: {TRIGGER.NAME}: {TRIGGER.STATUS}
    • Operations
      • Operation type: Send message
      • Send to Users: [さっき設定したユーザ]
      • Send only to: Notify My Android

できた

f:id:int_remain:20140121012135p:plain

(´つヮ⊂)ウオォォ