Nagios

Nagios 通知執行的腳本不發送郵件

  • May 4, 2016

我正在執行一個新的 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

所以,首先感謝所有幫助過我的人。

這不是 nagios 的問題。

概括:

  1. nagios 檢查每個服務工作正常郵件腳本發送
  2. 通過控制台發送郵件(帶或不帶參數)
  3. nagios 觸發了事件並很好地執行了郵件腳本

這真是令人困惑。在我絕望中,我在郵件腳本中添加了一個全域異常處理程序,它將異常結果寫入文件。在那裡我發現了一個錯誤條目,該條目僅在從 nagios 執行腳本時拋出。

該腳本現在沒有找到所需的文件,因為 LOAD_PATH 不正確。

解決方案:

所以在要求之前:

require 'ntlm/smtp'

我通過以下方式手動添加了文件的路徑:

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

現在,通過從 nagios 執行郵件腳本可以正常工作。

引用自:https://serverfault.com/questions/773837