如何通過主機狀態的變化觸發服務檢查?
我們有一組伺服器,其中任何一個都可能出現故障,生成中等優先級通知:
define host { host_name foo1 contacts medium-priority use default-host } ...
但是,當兩個以上的此類伺服器出現問題時,我們希望獲得更高優先級的通知。為此,我們使用 Nagios’/Icinga 的
check_cluster
-utility 設置了一個單獨的服務定義:define service { service_description foo-cluster servicegroups cluster-checks display_name Foo Cluster check_command check_cluster_host!Foo Cluster!0!3!$HOSTSTATEID:foo1$,$HOSTSTATEID:foo2,...$HOSTSTATEID:fooN$ contacts high-priority hostgroup_name clusters notes Check, that no more than 2 hosts in group foo are in trouble use default-service }
以上可能會起作用,但我希望這個服務檢查不是由時間觸發,而是由任何“基礎”主機的狀態變化觸發……
我們使用 Ansible 生成 Icinga 的配置文件,因此可以以程式方式建構複雜的依賴關係——但是這樣的觸發可以實現嗎?
您可以在主機上定義一個事件處理程序,它基本上是一個“基於參數做某事”的小腳本。您可以將主機的狀態屬性從執行時宏作為命令參數傳遞。
https://www.icinga.com/docs/icinga1/latest/en/eventhandlers.html
我會走路線並在主機上定義一個自定義變數,該變數定義了在觸發事件處理程序時要觸發的服務。這樣您就不需要在腳本中對它們進行硬編碼。
然後,您的腳本可能會決定通過外部命令管道強制執行新服務檢查。您可能應該定義 HARD 或 SOFT 狀態是否足夠 - 請記住,事件處理程序僅在狀態更改時觸發,而不是在 DOWN->DOWN->DOWN 例如。
範例:https ://github.com/Icinga/icinga-core/blob/master/contrib/eventhandlers/submit_check_result.in
注意:該服務不應啟用主動檢查,並且不使用虛擬命令,而是使用實際的服務檢查命令。
(這樣的檢查結果送出發生在舊的 Nagios/Icinga1 世界中,如果您正在尋找更多有關命令管道和事件處理程序的範例,那麼它也用於有點駭人聽聞的分佈式監控)。