事件處理程序
介紹

事件處理程序是可選的系統命令(腳本或可執行文件),每當主機或服務狀態發生更改時運行。
事件處理程序的一個明顯用途是Nagios Core能夠在通知任何人之前主動解決問題。事件處理程序的其他一些用途包括:
- 重新啟動失敗的服務
- 在技術支持系統中輸入故障單
- 將事件信息記錄到數據庫
- 重啟主機電源*
- 等等
*可能無法輕易實現在具有自定義腳本問題的主機上重新啟動電源。在實施自動重新引導之前,請仔細考慮這樣做的后果。
什么時候執行事件處理程序?
服務或主機在以下情況下執行事件處理程序:
- 處于SOFT問題狀態
- 最初進入HARD問題狀態
- 最初從SOFT或HARD問題狀態恢復
此處 詳細描述SOFT和HARD狀態。
事件處理程序類型
您可以定義不同類型的可選事件處理程序,以處理主機和狀態更改:
- 全局主機事件處理程序
- 全局服務事件處理程序
- 主機特定的事件處理程序
- 特定于服務的事件處理程序
對于每個發生的主機或服務狀態更改,都會在可能運行任何特定于主機或服務的特定事件處理程序之前立即運行全局主機和服務事件處理程序。您可以通過使用主配置文件中的global_host_event_handler和global_service_event_handler選項來指定全局事件處理程序命令。
各個主機和服務可以具有自己的事件處理程序命令,應運行該命令以處理狀態更改。您可以在主機和服務定義中使用event_handler指令指定應運行的事件處理程序。這些(特定于主機和服務的)事件處理程序在(可選)全局主機或服務事件處理程序執行后立即執行。
啟用事件處理程序
通過使用主配置文件中的enable_event_handlers,可以在整個程序范圍內啟用或禁用事件處理程序。
通過使用主機和服務定義中的event_handler_enabled指令,可以啟用或禁用特定于主機和服務的事件處理程序。如果禁用了全局enable_event_handlers選項,則將不執行特定于主機和服務的事件處理程序。
事件處理程序執行順序
如前所述,全局主機和服務事件處理程序在特定于主機或服務的事件處理程序之前立即執行。
發出通知后,將立即針對HARD問題和恢復狀態執行事件處理程序。
編寫事件處理程序命令
事件處理程序命令可能是shell或perl腳本,但是它們可以是可以從命令提示符運行的任何類型的可執行文件。腳本至少應將以下宏作為參數:
對于服務:$ SERVICESTATE $,$ SERVICESTATETYPE $,$ SERVICEATTEMPT $
萬軍:$ HOSTSTATE $,$ HOSTSTATETYPE $,$ HOSTATTEMPT $
腳本應檢查傳遞給它的參數的值,并根據這些值采取任何必要的措施。了解事件處理程序如何工作的最好方法是看一個示例。幸運的是,下面提供了一個。
提示:其他示例事件處理程序腳本可以在Nagios Core發行版的contrib / eventhandlers /子目錄中找到。其中一些示例腳本演示了如何使用外部命令來實現冗余和分布式監視環境。
事件處理程序命令的權限
事件處理程序命令通常將以與Nagios Core在您的計算機上運行的用戶相同的權限執行。如果您要編寫重新啟動系統服務的事件處理程序,可能會出現問題,因為執行此類任務通常需要root特權。
理想情況下,您應該評估將要實現的事件處理程序的類型,并向Nagios Core用戶授予足夠的權限以執行必要的系統命令。您可能想嘗試使用sudo完成此操作。
服務事件處理程序示例
下面的示例假定您正在監視本地計算機上的HTTP服務器,并已將restart-httpd指定為HTTP服務定義的事件處理程序命令。同樣,我將假設您已將服務的max_check_attempts選項設置為4或更大的值(即,在對服務進行4次檢查之前,將其視為真正的問題)。縮寫的示例服務定義可能如下所示:
定義服務{
host_name somehost
service_description HTTP
max_check_attempts 4
event_handler重新啟動-httpd
...
}
使用事件處理程序定義服務后,我們必須將該事件處理程序定義為命令。下面顯示了restart-httpd的示例命令定義。請注意我要傳遞給事件處理程序腳本的命令行中的宏-這些很重要!
定義命令{
command_name重新啟動-httpd
command_line / usr / local / nagios / libexec / eventhandlers / restart-httpd $ SERVICESTATE $ $ SERVICESTATETYPE $ $ SERVICEATTEMPT $
}
現在,讓我們實際編寫事件處理程序腳本(這是/ usr / local / nagios / libexec / eventhandlers / restart-httpd腳本)。
#!/ bin / sh
#
#事件處理程序腳本,用于在本地計算機上重新啟動Web服務器
#
#注意:只有在以下情況下,該腳本才會重新啟動Web服務器:
#重試了3次(處于“軟”狀態)或Web服務以某種方式重試
#設法進入“硬”錯誤狀態。
#
#HTTP服務處于什么狀態?
案例“ $ 1”在
好)
#服務剛剛恢復,所以什么也不要做...
;;
警告)
#我們實際上并不關心警告狀態,因為該服務可能仍在運行...
;;
未知)
#我們不知道是什么導致了未知錯誤,所以什么也不要做...
;;
危急)
#啊哈!HTTP服務似乎有問題-也許我們應該重新啟動服務器...
#這是“軟”狀態還是“硬”狀態?
案例“ $ 2”在
#我們處于“軟”狀態,這意味著Nagios正在重試
#檢查它變成“硬”狀態,并通知聯系人...
柔軟的)
#我們正在進行哪些檢查?我們不想在第一時間重新啟動Web服務器
#檢查,因為這可能只是a幸!
案例“ $ 3”在
#等待3次檢查之后,重新啟動Web服務器。
#如果第四次檢查失敗(在重新啟動Web服務器之后),則狀態為
#類型將變為“ hard”,并且將通知該問題給聯系人。
#希望這將成功重新啟動Web服務器,因此第四次檢查將
#導致“軟”恢復。如果發生這種情況,則不會有人收到通知,因為我們
#解決了問題!
3)
echo -n“正在重新啟動HTTP服務(第三軟臨界狀態)...”
#調用初始化腳本重啟HTTPD服務器
/etc/rc.d/init.d/httpd重新啟動
;;
埃薩克
;;
#HTTP服務以某種方式成功變成了硬錯誤,而沒有得到修復。
#它應該已經通過上面的代碼重新啟動,但是由于某種原因沒有重新啟動。
#最后嘗試一下,好嗎?
#注意:此時已經通知聯系人有關服務的問題
#點(除非您禁用了此服務的通知)
硬)
echo -n“正在重新啟動HTTP服務...”
#調用初始化腳本重新啟動HTTPD服務器
/etc/rc.d/init.d/httpd重新啟動
;;
埃薩克
;;
埃薩克
出口0
上面提供的示例腳本將嘗試在兩個不同的實例中重新啟動本地計算機上的Web服務器:
- 在第三次重新檢查該服務并使其處于SOFT CRITICAL狀態后
- 服務首次進入“嚴重”狀態后
理論上,該腳本應該重新啟動并從Web服務器重新啟動,并在服務進入“硬”問題狀態之前解決該問題,但是如果該腳本第一次無法正常運行,我們會提供一個備用案例。應該注意的是,事件處理程序只會在服務第一次進入HARD問題狀態時才執行。如果服務仍然處于HARD問題狀態,這可以防止Nagios Core持續執行腳本以重新啟動Web服務器。
事件處理程序易于編寫和實現,因此請嘗試一下。
Nagios Core中文使用教程