SlackとIcinga (Nagios) でサーバー監視
Page content
自分はIcingaでサーバー監視しまくり。MTUの設定していないからメール通知はしていない。監視画面見に行かないとわからない感じになっている。微妙。そこでNagiosまたはIcingaを自作Hubotと連携してSlackに通知! …と思ったが、実はNagios integrationがslackにあるのだった。今回はそれの導入。
SlackでNagios Integrationの導入
- Nagios Integrationをここから有効化
- 出て来るSetup Instructionsに従って設定
- perl moduleのインストール: apt-get 的には libwww-perl libcrypt-ssleay-perl だが、CentOSでは類似の別名称
- 通知時に実行するコマンドの nagios.pl をダウンロード - slackのteam nameや、Slack AppのNagiosに割り当てられたtokenをべた書きする必要あり
/usr/local/icinga/etc/objects/slack_nagios.cfg
を作成(パスは人それぞれ)、instructionにある内容をベタ貼り - slackに通知がうまく飛ばないとき、ここのcommand_lineをCLIで手動実行すると標準エラー出力とか拾えてためになる。/usr/local/bin/slack_nagios.pl -field slack_channel=#zzzzz
- 参考:/usr/local/icinga/etc/objects/slack_nagios.cfg
の例define contact { contact_name slack alias Slack service_notification_period 24x7 host_notification_period 24x7 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=#zzzzzz } define command { command_name notify-host-by-slack command_line /usr/local/bin/slack_nagios.pl -field slack_channel=#zzzzzz }
- 参考: `/usr/local/bin/slack_nagios.pl`
```perl
#!/usr/bin/perl
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 = "xxxxxxx.slack.com"; # Your team's domain
my $opt_token = "yyyyyyyyyyy"; # The token from your Nagios services page
# 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";
```
- ちなみに channel はここで指定するが、全て #alerts にした(もちろんslackでchannel作成の必要あり)
/usr/local/icinga/etc/icinga.cfg
のenable_environment_macros=1
を宣言するのを忘れずに。$ sudo /usr/local/icinga/bin/icinga -v /usr/local/icinga/etc/icinga.cfg
してコンフィグチェック- reloadしたら完成!
- 通知テストは、Icingaのweb画面から、サービスやホストを選んで
Send custom notification
を実行すればOK.
今後
- SSL証明書の有効期限とか、更新完了・失敗のお知らせをslackにできたらいいなぁ。それはicingaに監視をセットするか、別スクリプトにするか…検討。->できたよ!
- muninでの監視内容もslackに乗せてきたいなぁ。->やったよ!