slack×Nagiosでアラートをプッシュ通知
DACではサーバ・NW機器のリソースの監視に「Nagios」を利用してます。
監視ホストも数百台規模で増え続けており、アラート検知が非常に重要な課題となってきています。
メールの通知では、各MLを通知先に設定して、フィルタ分けして…と何かと面倒ですね。
そこで「slackへアラート内容を飛ばして、プッシュ通知で受け取る。」
アラートの通知先としてslackにて通知を受けれるよう、slack×Nagios連携してみました。
slackとは?
slackとは、2014年に正式に公開された北米発のコミュニケーションツールです。
近年では、コミュニケーションツールを選択する上で、slackを選択する企業も増えてきているようです。
機能は
- チャット
- ファイル添付
- 検索
- 画像動画共有
- コード共有
など、単なるチャットツールではなくなってきています。
また、マルチプラットフォーム「スマホ(iOS/android)」「PC(Windows/Mac)」なのも、使いやすいツールの要因といえるでしょう。
最近では、「Googleカレンダー」と連携を発表し、ますます連携面での強化を図っているようです。
当社でも、コミュニケーションツールとして、slackやHipchatを利用しております。
slackの魅力を話す上で欠かせないのは、なんといっても、「外部サービス連携」。
当社でも「Git Hub」「Redmine」「Jenkins」など様々な外部サービスと連携しております。
連携しやすい点は大きな魅力ですね。
Nagios×slack連携イメージ
Nagiosで検知したアラートをメールではなく、slackのChannelへ流します。
各プロジェクトのChannelへ流すことで、メールの仕分けや、通知先設定(宛て先追加)も不要となります。
変更前:Nagios×メール
変更後:Nagios×slack
Nagios×slack 連携手順
1.slack側からNagiosの統合設定を有効化。
2.NagiosがslackにAPI連携するためのTokenを発行。
※ここのTokenの値「hogehogehogehoge」はNagiosサーバの変数に入れる必要があるため、控えておく。
3.Nagios用Channel作成
slack側に通知先となるChannelを事前に作成しておく。
ここでは#Nagiosという名前で作成する。
4.slack連携用プログラム取得
Nagiosサーバにてslack連携用プログラム(nagios.pl)を取得する。
# wget https://raw.github.com/tinyspeck/services-examples/master/nagios.pl
# cp nagios.pl /usr/local/bin/slack_nagios.pl
# chmod 755 /usr/local/bin/slack_nagios.pl
5.ドメイン名とTokenを変数に設定
66,67行目のドメイン名とTokenの値を変数に設定する。
ドメイン名には、Slackチームドメイン名、Tokenには2で発行した値を設定します。
# vi /usr/local/bin/slack_nagios.pl
1 |
[shell]
#!/usr/bin/perl
# Copyright 2013 Tiny Speck, Inc
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# A nagios/icinga plugin for sending alerts to Slack. See more documentation on the team services page at:
# https://my.slack.com/services/new/nagios
#
# Requires these perl modules:
# HTTP::Request
# LWP::UserAgent
#
# I am not a perl programmer. Beware.
#
# An example Nagios config:
#
# define contact {
# contact_name slack
# alias Slack
# service_notification_period 24×7
# host_notification_period 24×7
# service_notification_options w,u,c,r
# host_notification_options d,r
# service_notification_commands notify-service-by-slack
# host_notification_commands notify-host-by-slack
# }
#
# define command {
# command_name notify-service-by-slack
# command_line /usr/local/bin/slack_nagios.pl -field slack_channel=#alerts
# }
#
#define command {
# command_name notify-host-by-slack
# command_line /usr/local/bin/slack_nagios.pl -field slack_channel=#ops
# }
#
use warnings;
use strict;
use Getopt::Long;
use HTTP::Request::Common qw(POST);
use HTTP::Status qw(is_client_error);
use LWP::UserAgent;
#
# Customizable vars. Set these to the information for your team
#
my $opt_domain = "test.slack.com"; # Slackチームドメイン名
my $opt_token = "hogehogehogehoge"; # Slackで発行したToken
#
# Get command-line opts
#
my %opt_fields;
GetOptions("field=s%" => \%opt_fields);
#
# DO THINGS
#
my %event;
# Get all Nagios variables
while ((my $k, my $v) = each %ENV) {
next unless $k =~ /^(?:NAGIOS|ICINGA)_(.*)$/;
$event{$1} = $v;
}
# Merge in passed-in variables
%event = (%event, %opt_fields);
$event{"slack_version"} = "1.1";
#
# Make the request
#
my $ua = LWP::UserAgent->new;
$ua->timeout(15);
my $req = POST("https://${opt_domain}/services/hooks/nagios?token=${opt_token}", \%event);
my $s = $req->as_string;
print STDERR "Request:\n$s\n";
my $resp = $ua->request($req);
$s = $resp->as_string;
print STDERR "Response:\n$s\n";
[/shell]
6.Nagios設定ファイル変更
1.contacts.cfgへコンタクトの定義を追記する。
# vi /usr/local/nagios/etc/objects/contacts.cfg
[shell]
#slack
define contact {
contact_name slack
alias Slack
service_notification_period 24×7
host_notification_period 24×7
service_notification_options w,u,c,r
host_notification_options d,r
service_notification_commands notify-service-by-slack
host_notification_commands notify-host-by-slack
}
[/shell]
2.commands.cfgへコマンド定義を追記する。
# vi /usr/local/nagios/etc/objects/commands.cfg
[shell]
#slack
define command {
command_name notify-service-by-slack
command_line /usr/local/bin/slack_nagios.pl -field slack_channel=#nagios
}
define command {
command_name notify-host-by-slack
command_line /usr/local/bin/slack_nagios.pl -field slack_channel=#nagios
}
[/shell]
これだけで、設定完了です!
7.slackの通知画面
Criticalを赤色、Warningを黄色、Recoveryを緑色で分けて通知してくれるため、
一目でアラート状況を把握することができます。
Nagios×slackの連携にてslackにてアラート通知を行うことができました。
スマホのアプリでプッシュ通知を入れておくだけで、通知も問題ありません。
通知先を個別で設定する必要がないので、思ったより簡単に連携ができました。

関連記事
-
-
Vagrantの機能を使って開発環境の効率をあげてみた。
プラットフォーム・ワンのシステムの運用・保守担当のエンジニアです。 保守の仕事に関わると、 ユーザからのお問い合わせだったり、監視アラートによる検知から システムを調査することがあります。 ログとソースコードを見て、不具合を特定し改修する。 すぐできればカッコいいですが、 「本番環境に反映して別のエ …
-
-
【クラウド初心者向け】Google Cloud Platform(GCP)でWebサイトを公開してみよう!
はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 背景 わたくしは最近プライベートで開発したWebサービスをインターネット上に公開しまし …
-
-
Selenium × PHP でテスト自動化!【環境構築編】
はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 テスト自動化の背景 わたくしが担当するXmediaOneでは品質担保のために①コードベ …
-
-
Rundeck&Win32-OpenSSHでWindowsのバッチをリモート実行させてみました
こんにちは。インフラ開発部の福本です。 Webサービスの提供を長く続けていると、どうしても継ぎ接ぎで改修が行われていくことも多く、それにあわせてスケジュール登録されるCronやTaskなども煩雑になってきますよね。 開発メンバーが異動でいなくなってしまうと、そもそもどこで何の処理が動いているのか探す …
-
-
Qiita Team API と Google Spread Sheet でチーム日報を生成する
チーム日報を活用する MarketOne 開発チームでは複数拠点に分かれての開発を行っています。リモート開発が中心となると口頭でのコミュニケーションに限界があるため、テキストベースのコミュニケーションの比重が高い状態にあります。 チケットシステムやソースコード管理ツール上の議論はもちろんおこなってい …
-
-
GoogleスプレッドシートからTreasureDataへデータを取り込む
AudienceOneの開発を担当しています。skryoです。 またまたTreasureDataネタですが、今回はGoogleスプレッドシートからGoogleAppsScriptを使ってTreasureDataへデータを取り込む手順を紹介したいと思います。 なぜ? Googleスプレッドシート上でマ …
-
-
ActiveDirectoryをフォレスト間で移行する(その2)
こんにちは。インフラ開発部の福本です。 2015年も残り約半分ですね。ボーっとしていると、あっという間に日々が過ぎていきます。 その中、少しずつ迫るWindowsServer2003のサポート期限。 保守切れとなるサーバOSの移行に忙殺されているサーバ管理者の方も、いらっしゃるのではないでしょうか。 …