タグ : Nagios

[Nagios] check_load での load average (ロードアベレージ) のチェックの設定変更

load average が跳ね上がることが増えてきたので、Nagios の check_load コマンドの設定を変更しました。

check_load のデフォルト値

define service{
        use                             generic-service
        host_name                       hoge
        service_description             LOAD
        is_volatile                     0
        check_period                    24x7
        max_check_attempts              3
        normal_check_interval           5
        retry_check_interval            1
        notification_interval           240
        notification_period             24x7
        notification_options            c,r
        check_command                   check_load!1,1,1!2,2,2
        contact_groups                  linux-admins
}

max_check_attempts を 3 回から 2 回に、normal_check_interval を 5 分から 3 分に変更しました。

check_load の設定変更後の値

define service{
        use                             generic-service
        host_name                       hoge
        service_description             LOAD
        max_check_attempts              2
        normal_check_interval           3
        retry_check_interval            1
        check_command                   check_load!1,1,1!2,2,2
}

チェック間隔を短くしたので、サーバが悲鳴をあげる前に対応できるようになるはず。


参考情報

Nagios/プラグイン/check_load – cubic9.com

テンプレートベースオブジェクトデータ設定ファイルオプション

[Slack] Nagios からの通知を Channel に書き込む

Nagios からのアラート通知を Slack の Incoming WebHooks を利用して Channel へ書き込む設定をしました。

Slack には Nagios の Integration が用意されているので、普通はこれ使えば良さそうです。

しかし、今回は Lite プランに抑えたいという理由で、色々とインテグレーションを使ってると 5 external integrations の上限に引っかかってしまうのを避けるために Incoming WebHooks を使って自前で実装しました。Incoming WebHooks の Webhook URL を発行するのは上限ないみたいなので重宝しています。

早速、シェルスクリプトを書こうと思ったんですが、ググったら Gist にコード公開している人が居たので fork してちょっと書き換えて使うことにしました。

slack_nagios.sh – gist

下記が、gist に公開しているシェルスクリプトの内容です。

#!/bin/bash
 
# This script is used by Nagios to post alerts into a Slack channel
# using the Incoming WebHooks integration. Create the channel, botname
# and integration first and then add this notification script in your
# Nagios configuration.
#
# All variables that start with NAGIOS_ are provided by Nagios as 
# environment variables when an notification is generated.
# A list of the env variables is available here: 
#   http://nagios.sourceforge.net/docs/3_0/macrolist.html
#
# More info on Slack
# Website: https://slack.com/
# Twitter: @slackhq, @slackapi
#
# My info
# Website: bakorer.com
# Twitter: @bakorer
 
#Modify these variables for your environment
MY_NAGIOS_HOSTNAME="nagios.yourdomain.com"
MY_NAGIOS_STATUS_URL="http://${MY_NAGIOS_HOSTNAME}/nagios/cgi-bin/status.cgi?host=${NAGIOS_HOSTNAME}"
SLACK_HOSTNAME="yourslack.slack.com"
SLACK_TOKEN="xyxyxyourslackkey"
SLACK_CHANNEL="#alert"
SLACK_BOTNAME="Nagios"
 
 
#Set the message icon based on Nagios service state
if [ "$NAGIOS_SERVICESTATE" = "CRITICAL" ]
then
    ICON=":exclamation:"
    COLOR="danger"
elif [ "$NAGIOS_SERVICESTATE" = "WARNING" ]
then
    ICON=":warning:"
    COLOR="warning"
elif [ "$NAGIOS_SERVICESTATE" = "OK" ]
then
    ICON=":white_check_mark:"
    COLOR="good"
elif [ "$NAGIOS_SERVICESTATE" = "UNKNOWN" ]
then
    ICON=":question:"
    COLOR="#00FFFF"
else
    ICON=":white_medium_square:"
    COLOR="#FFFFFF"
fi
 
#Send message to Slack
curl -X POST --data "payload={\"channel\": \"${SLACK_CHANNEL}\", \"username\": \"${SLACK_BOTNAME}\", \"icon_url\": \"https://slack.com/img/services/nagios_48.png\", \"text\": \"${ICON} HOST: ${NAGIOS_HOSTNAME}   SERVICE: ${NAGIOS_SERVICEDISPLAYNAME}     MESSAGE: ${NAGIOS_SERVICEOUTPUT} <${MY_NAGIOS_STATUS_URL}|See Nagios>\"}" https://${SLACK_HOSTNAME}/services/hooks/incoming-webhook?token=${SLACK_TOKEN}

これを Nagios を動かしているサーバーの plugins 以下とかに設置して、実行できるようにします。

chmod +x /usr/lib64/nagios/plugins/slack_nagios.sh

そして、Nagios commands に slack_nagios.sh を実行する定義を追加します。

vim /etc/nagios/objects/commands.cfg
 
define command {
    command_name    notify-service-by-slack
    command_line    /usr/lib64/nagios/plugins/slack_nagios.sh
}

contacts にも Slack を追加します。

vim /etc/nagios/objects/contacts.cfg
 
define contact {
  contact_name slack
  use generic-contact
  service_notification_commands   notify-service-by-slack
  email   /dev/null
}

あとは Slack の #alert channel に通知したいサービスに登録してあげて、設定確認と reload すれば完了です。

service nginx configtest
service nagios reload

Nagios のアラートを Slack へテスト通知してみた結果は下記のような感じです。

slack-nagios

Slack はチャンネル毎にアプリで通知を受け取るか設定できるので、これで夜中に Nagios からアラートきても気付けて、即対応できて幸せですね!

[Nagios] アラートメールの内容を変更する

Nagios からのアラートメールを社内メンバー(非エンジニア)向けにも送信することになったので、分かりやすいメールの内容に変更しました。

メールの内容を変更するために notify-service-by-email をベースに、notify-service-for-member-by-email コマンドを定義しました。

define command {
  command_name notify-service-for-member-by-email
  command_line /usr/bin/printf "%b" "サーバーの異常を検知しました。\n\nステータス: $SERVICESTATE$\nサービス名: $HOSTALIAS$\nドメイン名: $HOSTADDRESS$\n監視対象: $SERVICEDESC$\n\n■日時: $LONGDATETIME$\n\n■連絡先:\nステータス「CRITICAL」の場合、至急サーバー管理者へ連絡して下さい。\n\n・重岡: 090-XXXX-XXXX\n\n■追加情報:\n$SERVICEOUTPUT$\n\n" | /bin/mail -s "*Alert* $HOSTALIAS$/$SERVICEDESC$ : ステータス $SERVICESTATE$" $CONTACTEMAIL$
}

下記は、メールの内容です。

[件名]:
*Alert* codenote/HTTPS : ステータス CRITICAL
 
[本文]:
サーバーの異常を検知しました。
 
ステータス: CRITICAL
サービス名: codenote
ドメイン名: codenote.com
監視対象: HTTPS
 
■日時: Thu Jun 5 06:04:08 UTC 2014
 
■連絡先:
ステータス「CRITICAL」の場合、至急サーバー管理者へ連絡して下さい。
 
・重岡: 090-XXXX-XXXX
 
■追加情報:
HTTP CRITICAL: HTTP/1.1 200 OK - 146477 bytes in 0.093 second response time

以上です。

[Nagios] Web管理画面から操作するための設定方法

Nagios のWeb管理画面から操作するための設定方法をメモ。

エラーメッセージ

Sorry Dave, I can’t let you do that…

It seems that you have chosen to not use the authentication functionality of the CGIs.

I don’t want to be personally responsible for what may happen as a result of allowing unauthorized users to issue commands to Nagios,so you’ll have to disable this safeguard if you are really stubborn and want to invite trouble.

Read the section on CGI authentication in the HTML documentation to learn how you can enable authentication and why you should want to.

原因としては、下記の2点です。

  • Nagios のウェブ管理画面のプロセスを起動させている nginx ユーザーを nagios グループに追加していなかった
  • nagios グループに nagios の設定変更を行う command を許可していなかった

nginx ユーザーを nagios グループに追加します。

usermod -G nagios nginx

そして、use_authentication を有効にして、nagios グループのユーザーのみコマンドを実行できるような設定に変更します。

# diff cgi.cfg cgi.cfg.2014-05-28 
78c78
< use_authentication=1
---
> use_authentication=0
107c107
< default_user_name=nagios
---
> #default_user_name=guest
119c119
< authorized_for_system_information=nagios
---
> authorized_for_system_information=nagiosadmin
131c131
< authorized_for_configuration_information=nagios
---
> authorized_for_configuration_information=nagiosadmin
144c144
< authorized_for_system_commands=nagios
---
> authorized_for_system_commands=nagiosadmin
157,158c157,158
< authorized_for_all_services=nagios
< authorized_for_all_hosts=nagios
---
> authorized_for_all_services=nagiosadmin
> authorized_for_all_hosts=nagiosadmin
171,172c171,172
< authorized_for_all_service_commands=nagios
< authorized_for_all_host_commands=nagios
---
> authorized_for_all_service_commands=nagiosadmin
> authorized_for_all_host_commands=nagiosadmin

以上です。


参考情報

Nagiosの最初の設定

[Nagios] 設定ファイルの確認、再読み込みなど

Nagios で、設定ファイルの確認、再読み込みなどを行うコマンドをメモ。

設定ファイルの確認

# service nagios checkconfig
Running configuration check... OK.

設定ファイルの再読み込みは restart でなくて、reload でOK

# service nagios reload