SlackとIcinga (Nagios) でサーバー監視

Page content

自分はIcingaでサーバー監視しまくり。MTUの設定していないからメール通知はしていない。監視画面見に行かないとわからない感じになっている。微妙。そこでNagiosまたはIcingaを自作Hubotと連携してSlackに通知! …と思ったが、実はNagios integrationがslackにあるのだった。今回はそれの導入。

SlackでNagios Integrationの導入

参考リンク

  1. Nagios Integrationをここから有効化
  2. 出て来るSetup Instructionsに従って設定
  3. perl moduleのインストール: apt-get 的には libwww-perl libcrypt-ssleay-perl だが、CentOSでは類似の別名称
  4. 通知時に実行するコマンドの nagios.pl をダウンロード - slackのteam nameや、Slack AppのNagiosに割り当てられたtokenをべた書きする必要あり
  5. /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作成の必要あり)
  1. /usr/local/icinga/etc/icinga.cfgenable_environment_macros=1 を宣言するのを忘れずに。
  2. $ sudo /usr/local/icinga/bin/icinga -v /usr/local/icinga/etc/icinga.cfg してコンフィグチェック
  3. reloadしたら完成!
  4. 通知テストは、Icingaのweb画面から、サービスやホストを選んで Send custom notification を実行すればOK. テスト結果

今後

  • SSL証明書の有効期限とか、更新完了・失敗のお知らせをslackにできたらいいなぁ。それはicingaに監視をセットするか、別スクリプトにするか…検討。->できたよ!
  • muninでの監視内容もslackに乗せてきたいなぁ。->やったよ!