Назад | Перейти на главную страницу

Скрипт, выполняемый Nagios с уведомлением, не отправляет почту

Я использую новую систему nagios (сервер 3.5.1). все проверки работают нормально

[1461932408] SERVICE NOTIFICATION: nagiosadmin;appserver;Swapfile;CRITICAL;notify-service-by-email;CHECK_NRPE: Socket timeout after 10 seconds.
[1461932418] SERVICE NOTIFICATION: nagiosadmin;adminserver;Disk;CRITICAL;notify-service-by-email;CHECK_NRPE: Socket timeout after 10 seconds.

Я не могу пользоваться почтой, потому что почтовый сервер - это сервер обмена. поэтому я изменил команду на следующую:

# 'notify-host-by-email' command definition 
define command { 
command_name notify-host-by-email 
command_line /usr/bin/printf "%b" "Notification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | /usr/local/bin/mailsend.rb "***** Nagios Alert*****"
}

# 'notify-service-by-email' command definition 
define command { 
command_name notify-service-by-email 
command_line /usr/bin/printf "%b" "Notification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | /usr/local/bin/mailsend.rb "***** Nagios Alert*****"
}

mailsend.rb это ruby-скрипт, который принимает аргументы и подключается к серверу. если я вызову это напрямую, с параметрами, чтобы получить электронное письмо.

мой контакт выглядит следующим образом:

define contact{
  contact_name                    nagiosadmin       ; Short name of user
  use               generic-contact     ; Inherit default values from generic-contact template (defined above)
  alias                           Nagios Admin      ; Full name of user
  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-email
  host_notification_commands      notify-host-by-email
  email                           idontcare@examnple.org   ; 
  }

define contactgroup{
        contactgroup_name       admins
        alias                   Nagios Administrators
        members                 nagiosadmin
        }

похоже, что команда не вызывается nagios. скрипт имеет права 755. другие команды типа «прикосновение к файлу» также не будут работать.

вывод из режима отладки:

[1461935539.111737] [032.2] [pid=8391] ** Notifying contact 'nagiosadmin'
[1461935539.111762] [032.2] [pid=8391] Raw notification command: /usr/local/bin/mailsend.rb "***** Nagios Alert*****" "Notification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$"
[1461935539.111799] [032.2] [pid=8391] Processed notification command: /usr/local/bin/mailsend.rb "***** Nagios Alert*****" "Notification Type: PROBLEM\nHost: mysqlserver\nState: UP\nAddress: 10.130.1.22\nInfo: PING OK - Packet loss = 0%, RTA = 0.33 ms\n\nDate/Time: Fri Apr 29 15:12:19 CEST 2016"

Обновить:

если я заменю сценарий исходными строками, я буду получать письма в /var/mail.

пользователь nagios может запустить сценарий. Я вошел в систему с пользователем nagios и выполнил команду вручную.

update2 (доп. информация из комментариев)

скрипт ruby ​​использует #!/usr/bin/env ruby и отлично работает, вызывая его из командной строки. если я использую по умолчанию / usr / bin / mail, то я получил почту на локальную учетную запись пользователя на сервере. сценарий ruby ​​подключается к серверу и отправляет почту с другими учетными данными. это работает с пользователем nagios

у кого-нибудь была идея?

обновление 3: (ruby скрипт для отправки почты)

#!/usr/bin/env ruby
require 'net/smtp'
require 'logger'

require 'rubygems'
require 'net-ldap'
require '/home/user/lib/ntlm/smtp'
logger = Logger.new('/var/log/sendEmail')

server = '10.130.1.3'
port = 25      # or 25 - double check with your provider
username = 'user'
password = '****'

fromAddress = 'existingmail@existingdomain.de'
toAddress = 'me@example.com'
subject = ARGV[0]
message = ARGV[1]

logger.info subject
logger.info message

message_body = <<END_OF_EMAIL
From: Nagios <#{fromAddress}>
To: Logs <#{toAddress}>
Subject: #{subject}

#{message}
END_OF_EMAIL

smtp = Net::SMTP.new(server, port)
smtp.start(server,username,password, :ntlm)
smtp.send_message(message_body, fromAddress, toAddress)

обновление 4

nagios@background-server:/usr/local/bin$ whoami
nagios
nagios@background-server:/usr/local/bin$ ./mailsend.rb 
nagios@background-server:/usr/local/bin$
nagios@background-server:/usr/local/bin$ ls -la mailsend.rb 
-rwxr-xr-x 1 nagios nagios 811 May  2 09:05 mailsend.rb

Итак, сначала спасибо всем, кто мне помогал.

это не было проблемой нагиос.

резюме:

  1. nagios проверяет, что каждая служба работает нормально, почтовый скрипт отправляет
  2. почта через консоль (с параметром или без него)
  3. nagios запустил событие и выполнил штраф почтового скрипта

это действительно сбивало с толку. в отчаянии я добавил глобальный обработчик исключений в mailscript, который записывает результат исключения в файл. и там я нашел запись об ошибке, которая возникала только тогда, когда скрипт выполнялся из nagios.

теперь скрипт не находит требуемые файлы, потому что LOAD_PATH неверен.

решение:

поэтому перед требованиями:

require 'ntlm/smtp'

Я добавил путь к файлам вручную:

$:.unshift File.dirname('/home/application/my_application/current/lib/ntlm')

теперь почтовый скрипт отлично работает, выполняясь из nagios.