Ganglia與Centreon整合構建智能化監控報警平臺

1、智能運維監控報警平臺的組成

隨着大數據時代的來臨,運維工做的難度愈來愈大,每一個運維人員都要面臨不可勝數的服務器和海量的數據,如何保證衆多服務器和業務系統穩定高效地運行並儘可能減小死機時間,成爲考覈運維工做的重要指標,而要實現大規模的運維,必需要有一套行之有效的智能運維監控管理系統,本章就詳細介紹下如何構建一套完善的運維監控報警平臺。php

運維的核心工做能夠分爲運行監控和故障處理兩個方面,對業務系統進行精確、完善的監控,保證可以在第一時間發現故障並迅速通知運維人員處理故障是運維監控系統要實現的基礎功能;一個功能完善的智能監控系統,不但能夠自動處理一些簡單故障,減小運維工做量,還應該在應用可能出現故障時預先發出報警,預防故障的發生。所以,構建一個智能的運維監控平臺,必須以運行監控和故障報警這兩個方面爲重點,將全部業務系統中涉及的網絡資源、硬件資源、軟件資源、數據庫資源等歸入統一的運維監控平臺中,並經過消除管理軟件的差異,數據採集手段的差異,對各類不一樣的數據來源實現統一管理、統一規範、統一處理、統一展示、統一用戶登陸、統一權限控制,最終實現運維規範化、自動化、智能化的大運維管理。python

一個智能的運維監控平臺,通常的設計架構從低到高能夠分爲6層,三大模塊,以下圖所示。mysql

其中:ios

 數據收集層:位於最底層,主要收集網絡數據、業務系統數據、數據庫數據、操做系統數據等,而後將收集到的數據進行規範化並進行存儲。
 數據展現層:位於第二層,是一個Web展現界面,主要是將數據收集層獲取到的數據進行統一展現,展現的方式能夠是曲線圖、柱狀圖、餅狀態等,經過將數據圖形化,能夠幫助運維人員瞭解一段時間內主機或網絡的運行狀態和運行趨勢,並做爲運維人員排查問題或解決問題的依據。
 數據提取層:位於第三層,主要是對從數據收集層獲取到的數據進行規格化和過濾處理,提取須要的數據到監控報警模塊,這個部分是監控和報警兩個模塊的銜接點。
 報警規則配置層:位於第四層,主要是根據第三層獲取到的數據進行報警規則設置、報警閥值設置、報警聯繫人設置和報警方式設置等。
 報警事件生成層:位於第五層,主要是對報警事件進行實時記錄,將報警結果存入數據庫以備調用,並將報警結果造成分析報表,以統計一段時間內的故障率和故障發生趨勢。
 用戶展現管理層:位於最頂層,是一個Web展現界面,主要是將監控統計結果、報警故障結果進行統一展現,並實現多用戶、多權限管理,實現統一用戶和統一權限控制。
在這6層中,從功能實現劃分,又分爲三個模塊,分別是數據收集模塊、數據提取模塊和監控報警模塊,每一個模塊完成的功能以下:
 數據收集模塊:此模塊主要完成基礎數據的收集與圖形展現。數據收集的方式有不少種,能夠經過SNMP實現,也能夠經過代理模塊實現,還能夠經過自定義腳本實現。經常使用的數據收集工具備Cacti、Ganglia等。
 數據提取模塊:此模板主要完成數據的篩選過濾和採集,將須要的數據從數據收集模塊提取到監控報警模塊中。能夠經過數據收集模塊提供的接口或自定義腳本實現數據的提取。
 監控報警模塊:此模塊主要完成監控腳本的設置、報警規則設置,報警閥值設置、報警聯繫人設置等,並將報警結果進行集中展示和歷史記錄。常見的監控報警工具備Nagios、Centreon等。git

在瞭解了運維監控平臺的通常設計思路以後,接下來詳細介紹下如何經過軟件實現這樣一個智能運維監控系統。github

上圖是根據上圖的設計思路造成的一個運維監控平臺實現拓撲圖,從圖中能夠看出,主要有三大部分組成,分別是數據收集模塊、監控報警模塊和數據提取模塊,其中,數據提取模塊用於其餘兩個模塊之間的數據通訊,而數據收集模塊能夠有一臺或多臺數據收集服務器組成,每一個數據收集服務器能夠直接從服務器羣組收集各類數據指標,通過規範數據格式,最終將數據存儲到數據收集服務器中。監控報警模塊經過數據抽取模塊從數據收集服務器獲取須要的數據,而後設置報警閥值、報警聯繫人等,最終實現實時報警。報警方式支持手機短信報警、郵件報警等,另外,也能夠經過插件或者自定義腳原本擴展報警方式。這樣一整套監控報警平臺就基本實現了。web

2、Ganglia做爲數據收集模塊

關於Ganglia的基本應用,在前面章節已經詳細介紹過,這裏將Ganglia做爲監控報警平臺的數據收集模塊,主要基於如下幾方面的緣由:正則表達式

一、靈活的分佈式、分層體系結構,使Ganglia支持上萬個監控節點的數據收集,而且性能表現穩定,同時,Ganglia也能夠根據地域環境、網絡結構的不一樣,分地域、分層次靈活部署Ganglia數據收集點,而對於數據收集節點能夠動態添加或刪除,對Ganglia總體監控不產生任何影響,所以,能夠靈活擴展Ganglia數據收集節點。sql

二、收集數據更加精確,不但能夠收集實時數據,以圖表的形式展現出來,並且還容許用戶查看歷史統計數據,所以,用戶能夠經過這些數據,作出性能調整、升級、擴容等決策,從而保證應用系統可以知足不斷增加的業務需求。shell

三、能夠經過組播、單播的方式收集數據。在監控的節點較多時經過組播方式收集數據能夠大大下降數據收集的負載,提升監控和數據收集性能。而對於不能使用組播收集數據的網絡環境,還能夠經過單播的方式收集數據,所以Ganglia在數據收集方式上很是靈活。

四、可收集各類度量的數據。Ganglia默承認收集cpu、memory、disk、I/O、process、network六大方面的數據,同時還提供了C或者Python接口,用戶經過這個接口能夠自定義數據收集模塊,而且這些模塊能夠被直接插入到Ganglia中以監控用戶自定義的應用。

基於以上這些優勢,Ganglia很是適合做爲監控報警平臺的數據收集模塊。雖然Cacti也能夠實現數據的收集和圖形報表的展現,可是當監控節點愈來愈多時,Cacti的缺點就慢慢暴露出來了,數據收集的準確性、實時性就很可貴到保障了。所以,要構建一個高性能的監控報警平臺,Ganglia是首選的數據收集模塊。

3、Centreon做爲監控報警模塊

有了Ganglia收集數據仍是不夠的,運維人員不可能每天盯着數據報表,所以,還須要對收集到的數據進行監控和報警:對每一個須要監控的主機或服務,設置一個報警閥值,當收集到的數據超過這個閥值時,在第一時間能自動報警並通知運維人員,而在收集到的數據沒有超過指定的報警閥值時,運維人員就能夠去作別的事情,而不用時刻盯着數據報表,這是構建智能監控報警平臺必需要實現的一個功能。

對主機或服務的狀態值進行監控,當達到指定閥值時進行報警,要實現這個功能並非什麼難的事情,寫個簡單的腳本就能實現,可是這樣太原始了,沒有層次,維護性差,而且當須要監控報警的主機或服務愈來愈多時,腳本的性能就變得不好,管理也很是不方便,更別說有什麼可視化效果了,所以,須要有一個專業的監控報警工具來實現這個功能。

Centreon就是這樣一個專業的分佈式監控、報警工具,它經過第三方組件能夠實現對網絡、操做系統和應用程序的監控與報警。在底層,Centreon經過nagios做爲監控軟件;在數據層,Centreon經過ndoutil模塊將監控到的數據定時寫入數據庫中;在展現層,Centreon提供了Web界面來配置、管理須要監控的主機或服務,並提供多種報警通知方式,同時還能夠展示監控數據和報警狀態,而且可查詢歷史報警記錄。

關於Centreon的介紹和使用,在前面專欄已經作過很是詳細的介紹,這裏再也不多說。經過對Centreon的使用可知,Centreon不管在配置、管理、可視化等方面都作得很是專業和完善,而且在多主機、多服務監控的環境下,性能表現也很是穩定,所以,將Centreon做爲智能監控報警平臺的監控報警模塊很是適合。

4、Ganglia與Centreon的無縫整合

經過前面的介紹,肯定了以Ganglia做爲數據收集模塊,Centreon做爲監控報警模塊的方案,這樣,一個智能監控報警平臺兩大主要功能模塊已經基本實現了。但如今的問題是,如何將收集到的數據傳送給監控報警模塊呢,這就是數據抽取模塊要完成的功能。

數據抽取模塊要完成的功能是:從數據收集模塊中定時採集指定的數據,而後將採集到的數據與指定的報警閥值進行比較,若是發現採集到的數據大於或小於指定的報警閥值,那麼就經過監控報警模塊設置的報警方式進行故障通知。在這個過程當中,只有採集數據在數據收集模塊中完成,其餘操做,例如:採集數據時間間隔、報警閥值設置、報警方式設置、報警聯繫人設置等都在監控報警模塊中完成。

從數據抽取模塊完成的功能能夠看出,此模塊主要用來銜接數據收集模塊和監控報警模塊,進而實現Ganglia和Centreon的無縫整合。要實現數據抽取模塊的功能,方法有不少,最簡單最直接的方法就是編寫監控腳本,這裏提供幾個經常使用的數據抽取腳本,而後將腳本添加到Centreon中,下面介紹具體的操做過程。

4.一、數據抽取腳本

這裏提供一個數據抽取腳本,是基於Python編寫的,介紹以下。

這個腳本的原理是經過Ganglia提供的數據彙總端口來獲取數據,而後將獲取到的數據與指定的閥值進行對比,以判斷服務是否有異常。腳本內容以下:

#!/usr/bin/env python import sys import getopt import socket import xml.parsers.expat class GParser: def __init__(self, host, metric): self.inhost =0 self.inmetric = 0 self.value = None self.host = host self.metric = metric def parse(self, file): p = xml.parsers.expat.ParserCreate() p.StartElementHandler = parser.start_element p.EndElementHandler = parser.end_element p.ParseFile(file) if self.value == None: raise Exception('Host/value not found') return float(self.value) def start_element(self, name, attrs): if name == "HOST": if attrs["NAME"]==self.host: self.inhost=1 elif self.inhost==1 and name == "METRIC" and attrs["NAME"]==self.metric: self.value=attrs["VAL"] def end_element(self, name): if name == "HOST" and self.inhost==1: self.inhost=0 def usage(): print """Usage: check_ganglia_metric \ -h|--host= -m|--metric= -w|--warning= \ -c|--critical= """ sys.exit(3) if __name__ == "__main__": ############################################################## ganglia_host = '127.0.0.1' ganglia_port = 8651 host = None metric = None warning = None critical = None try: options, args = getopt.getopt(sys.argv[1:], "h:m:w:c:s:p:", ["host=", "metric=", "warning=", "critical=", "server=", "port="], ) except getopt.GetoptError, err: print "check_gmond:", str(err) usage() sys.exit(3) for o, a in options: if o in ("-h", "--host"): host = a elif o in ("-m", "--metric"): metric = a elif o in ("-w", "--warning"): warning = float(a) elif o in ("-c", "--critical"): critical = float(a) elif o in ("-p", "--port"): ganglia_port = int(a) elif o in ("-s", "--server"): ganglia_host = a if critical == None or warning == None or metric == None or host == None: usage() sys.exit(3) try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((ganglia_host,ganglia_port)) parser = GParser(host, metric) value = parser.parse(s.makefile("r")) s.close() except Exception, err: print "CHECKGANGLIA UNKNOWN: Error while getting value \"%s\"" % (err) sys.exit(3) if critical > warning: if value >= critical: print "CHECKGANGLIA CRITICAL: %s is %.2f" % (metric, value) sys.exit(2) elif value >= warning: print "CHECKGANGLIA WARNING: %s is %.2f" % (metric, value) sys.exit(1) else: print "CHECKGANGLIA OK: %s is %.2f" % (metric, value) sys.exit(0) else: if critical >= value: print "CHECKGANGLIA CRITICAL: %s is %.2f" % (metric, value) sys.exit(2) elif warning >= value: print "CHECKGANGLIA WARNING: %s is %.2f" % (metric, value) sys.exit(1) else: print "CHECKGANGLIA OK: %s is %.2f" % (metric, value) sys.exit(0)

你能夠下載源碼:https://www.ixdba.net/jk/ganglia_shell.tar.gz

在這個腳本中,須要修改的地方有兩個,分別是ganglia_host和ganglia_port。ganglia_host表示gmetad服務所在服務器的IP地址,Ganglia能夠和Centreon安裝到一塊兒,也能夠分開部署,當Ganglia和Centreon安裝在一塊兒時,這個值就是「127.0.0.1」。ganglia_port表示gmetad收集數據彙總的交互端口,默認是8651。

本例中,咱們的centreon和ganglia gmetad沒在一塊兒,所以,ganglia_host要填寫ganglia gmetad的IP爲172.16.213.157,須要注意的是,由於是centreon主機要訪問ganglia gmetad主機,因此還須要在ganglia gmetad的配置文件gmetad中增長以下選項:

[root@centreonserver bestjob]# cat gmetad.conf |grep 「trusted_hosts」 trusted_hosts 127.0.0.1 172.16.213.229

其中,172.16.213.229是centreon主機的ip地址。

上面全部配置完成後,將此腳本命名爲check_ganglia.py,而後放到Centreon存放nagios插件的目錄下,默認爲/usr/lib64/nagios/plugins,並授予可執行權限。接着介紹此腳本的用法。

[root@centreonserver plugins]# chmod 755 check_ganglia.py

在命令行直接執行check_ganglia.py腳本,便可得到使用幫助:

[root@centreonserver plugins]# python check_ganglia.py Usage: check_ganglia_metric -h|--host= -m|--metric= -w|--warning= -c|--critical=

下面分別介紹其中各個參數的意義。

 -h:表示從哪一個主機上提取數據,後跟主機名或IP地址。這裏須要注意的是,Ganglia默認將收集到的數據存放在gmetad配置文件中「rrd_rootdir」參數指定的目錄下,若是被監控的主機沒有主機名或主機名沒有進行DNS解析,那麼Ganglia就會用此主機的IP地址做爲目錄名來存儲收集到的數據,反之,就會以主機名做爲存儲數據的目錄名稱。

所以,這裏的「-h「參數就要以Ganglia存儲rrds數據的目錄名稱爲準。下面是Ganglia收集到的rrds數據的存儲結構:

[root@centreonserver bestjob]# pwd /data/rrdsdata/rrds/bestjob [root@centreonserver bestjob]# ls 192.168.11.188 host0080.bestjob.com host0078.bestjob.com 192.168.16.10 host0022.bestjob.com host0065.bestjob.com [root@centreonserver bestjob]# cd 192.168.11.188 [root@centreonserver 192.168.11.188]# ls cpu_num.rrd cpu_system.rrd disk_free.rrd load_five.rrd mem_cached.rrd mem_total.rrd cpu_speed.rrd cpu_user.rrd disk_total.rrd load_one.rrd mem_free.rrd part_max_used.rrd

 -m:表示要收集的指標值,例如cpu_num、disk_free、cpu_user、disk_total、load_one、part_max_used等,這些指標值能夠在Ganglia存儲rrds數據的目錄中找到,也能夠在Ganglia的Web界面中查找到。
 -w:表示警告的閥值,當此腳本收集到的指標值低於或者高於指定的警告閥值時,此腳本就會發出告警通知,同時此腳本返回狀態值1。
 -c:表示故障閥值,當此腳本收集到的指標值低於或者高於指定的故障閥值事,此腳本就會發出故障通知,同時此腳本返回狀態值2。

下面演示一下此腳本的用法,這裏以檢測host0080.bestjob.com主機的磁盤剩餘空間爲例,其餘指標值以此類推:

[root@centreonserver plugins]# ./ check_ganglia.py \ > -h host0080.bestjob.com -m disk_free -w 1000 -c 500 CHECKGANGLIA OK: disk_free is 3045.75 [root@centreonserver plugins]# echo $? 0 [root@centreonserver plugins]# ./ check_ganglia.py \ > -h host0080.bestjob.com -m disk_free -w 3045 -c 3000 CHECKGANGLIA WARNING: disk_free is 3043.68 [root@centreonserver nagios]# echo $? 1 [root@centreonserver plugins]# ./ check_ganglia.py \ > -h host0080.bestjob.com -m disk_free -w 3050 -c 3045 CHECKGANGLIA CRITICAL: disk_free is 3044.55 [root@centreonserver plugins]# echo $? 2 [root@centreonserver plugins]# ./ check_ganglia.py \ > -h host0080.bestjob.com -m part_max_used -w 90 -c 95 CHECKGANGLIA OK: part_max_used is 81.70

前三個例子主要用來檢測磁盤的剩餘空間。在檢測磁盤剩餘空間時使用的是「disk_free」這個指標值,這個「disk_free」是host0080.bestjob.com主機全部磁盤剩餘空間的總和,這裏的指標單位爲GB。

腳本的執行過程爲:若是剩餘磁盤空間正常,將輸出OK字樣,同時輸出剩餘磁盤空間量,並返回狀態值0,;若是檢測磁盤處於WARNING狀態,將返回狀態值1;若是檢測磁盤處於CRITICAL狀態,將返回狀態值2。這其實就是Nagios下狀態檢測腳本的基本寫法,Nagios就是經過腳本的返回狀態值來判斷服務處於何種狀態。

接着看最後一個例子,這個例子用到了「part_max_used」這個指標。這個指標表示磁盤分區的最大使用率,單位是百分比,它用來輸出系統中磁盤分區使用率的最大值。這個指標很是有用,常常用來判斷系統中某個磁盤分區是否已滿。在這個例子中,指定WARNING狀態的閥值是90%,CRITICAL狀態的閥值是95%,也就是當系統磁盤最大使用率達到95%時將發出CRITICAL報警。

最後,登陸Ganglia的web界面,查看host0080.bestjob.com主機的「disk_free」和「part_max_used」狀態圖,檢查一下經過Python腳本輸出的值是否和Ganglia生成的狀態圖一致,以下圖所示。

從圖中能夠看出,經過Python提取到的數值和Ganglia生成的狀態圖基本一致,若是要查看更詳細的統計,能夠點擊上圖進入詳細統計頁面,在這個詳細頁面,能夠查看每小時、天天、每週的磁盤狀態統計圖。另外,經過上圖還能夠發現,統計的指標值「disk_free」和「part_max_used」就在狀態圖的左上角,並配有指標含義解釋。

4.二、實現Ganglia與Centreon的完美整合

上面介紹了一個經常使用的數據抽取腳本及其用法,在實際應用中要實現對主機的監控報警,最簡單的方法是將上面例子中的操做命令寫到一個腳本,而後將這個腳本放到系統守護進程中,按期執行腳本檢測便可,可是這種方法不夠靈活,沒法設定詳細的聯繫人和聯繫人組,而且維護也不方便。

因爲Centreon底層監控引擎跟Nagios相似,所以將這些腳本做爲Nagios的插件,便可實現靈活的報警設置和便捷的管理。接下來以check_ganglia.py腳本爲例,演示下如何將此腳本集成到Centreon平臺上來,將其餘腳本集成到Centreon的方法與此徹底相同。

Ganglia和Centreon能夠分開獨立部署在兩臺服務器上,也能夠部署在一塊兒,這裏設定Ganglia和Centreon部署在兩臺服務器上。結合前面介紹的Centreon知識,在監控服務器的Centreon Web界面,選擇 Configuration—>Commands—>Checks,而後點擊Add新建一個Command,以下圖所示。

在上圖中,建立了一個名爲check_ganglia_py的Command,選擇「Command Type」爲「Check」。接着重點看「Command Line」的內容,其中,「$USER1$」就是Centreon服務器上Nagios監控插件的路徑,默認是「/usr/lib64/nagios/plugins」,前面已經把這個監控腳本放到了此路徑下,這裏直接引用便可。在這個腳本對應的參數中定義了三個參數變量「$ARG1$」、「$ARG2$」和「$ARG3$」,分別用於指定Ganglia metric、警告條件和CRITICAL閥值。這裏建議將每一個參數變量的做用都在「Argument Descriptions」選項中作個描述,以保證在添加服務時不容易出錯。

這樣,就將check_ganglia.py腳本做爲一個命令集成到Centreon中了。接下來演示一下如何經過這個腳本檢測一批主機的磁盤空間最大佔用率。首先在Centreon Web界面選擇Configuration—>Services—>Services by host group,點擊Add添加一個主機組服務,以下圖所示。

這裏先看一下「General Information」標籤中的幾個選項:「Description」就是監控服務的名稱,這裏定義爲check_disk_group ;「Linked with Host Groups」是指定此服務連接的主機組,若是有不少主機都須要監控同一個服務時,向主機一個一個添加服務就變得十分繁瑣,此時經過添加主機組的方式,一次性完成主機組下全部主機的監控,簡單而靈活。

接下來,「Template」是指定服務的模板,這裏仍然選擇「generic-service」; 「Service Check Options」選項下的「Check Command」選項用來指定服務檢查的命令,從下拉菜單中選擇剛纔建立的命令check_ganglia_py便可;最後一個選項「Args」就是剛纔建立check_ganglia_py命令時指定的三個變量,根據每一個變量的含義,依次填寫Ganglia metric、警告條件和CRITICAL閥值。
對於「Service Scheduling Options」選項以及「Notifications」標籤的報警通知的設置,由於已經在服務模板中都統一配置過了,因此無需設置。在完成全部設置後,保存退出,check_disk_group服務添加完成。

至此,已經完成check_ganglia.py腳本和Centreon的集成,其實也就是Ganglia和Centreon的集成,而這個腳本就是二者集成的橋樑而已。

在完成全部配置後,須要重啓Centreon服務,這樣全部的配置和修改才能生效。在重啓Centreon服務後,查看check_disk_group服務的運行狀態,以下圖所示。

從上圖中能夠看出,hostgroup1主機組中包含了四臺主機,每一個主機的磁盤最大佔用率都處於正常狀態,而且輸出了目前磁盤最大佔用率的比值。由此可知,check_ganglia.py腳本集成到Centreon後工做正常,完美實現了從Ganglia採集數據,在Centreon中設置報警規則的監控、報警一體化過程。

5、在Centreon中實現批量數據收集與監控報警

在上面已經介紹瞭如何經過數據抽取腳本從Ganglia中抽取數據,而後經過腳本的判斷最終實如今Centreon上的報警通知。這個過程看似很完美,其實隱藏着一些問題,好比,從給出的兩個數據抽取文件中,腳本每次只能檢測一臺主機的一個服務狀態,若是要檢測多臺主機的多個服務狀態,就須要屢次重複執行這個腳本。例如,要檢測100臺主機的磁盤最大佔用率,腳本就要重複執行100次,同理,要檢測100臺主機中的10個服務狀態,腳本就要執行1000次,在Centreon平臺中,腳本檢測是按期執行的,若是每一個小時執行一次檢測,那麼每一個小時就要執行腳本1000次。由此可知,這種腳本執行方式效率低下,嚴重浪費服務器資源,在監控主機較少的環境中,監控效率還勉強可以接受,可是當監控的主機超過500臺或更多,監控的服務超過100或更多時,監控效率將更加低下,監控腳本從Ganglia抽取數據的時間也將變得很長,可能還會發生獲取監控數據超時的狀況,這對於要求監控精度很高、報警及時性強的監控報警平臺來講,是不可容忍的。

若是能將監控腳本重複執行檢查的次數減小,或者讓腳本一次檢查多臺服務器的多個服務狀態,那麼腳本的執行效率將大大提高。在上節介紹的第二個腳本中,是經過讀取Ganglia Web的頁面信息來獲取監控數據的,既然經過此腳本能一次獲取某臺主機的信息,那麼也能一次獲取多臺主機的數據。很是幸運,這個功能Ganglia自己已經實現了,這裏只需稍做修改拿過來使用便可。在Ganglia Web的程序目錄下,有一個nagios目錄,這個目錄下有多個shell腳本和PHP腳本,這裏重點介紹下check_host_regex.sh和check_host_regex.php這兩個腳本,其餘腳本的使用方法與此相似。

通過修改後的check_host_regex.sh腳本內容以下:

GANGLIA_URL="http:// 172.16.213.157/ganglia/nagios/check_host_regex.php" # Build the rest of the arguments into the arg string for the URL. CHECK_ARGS='' if [ "$#" -gt "0" ] then CHECK_ARGS=$1 shift for ARG in "$@" do CHECK_ARGS=${CHECK_ARGS}"&"${ARG} done else echo "Sample invocation $0 hreg=web|apache checks=load_one,more,1:load_five,more,2 ignore_unknowns=0" echo " Set ignore_unknowns=1 if you want to ignore hosts that don't posses a particular metric." echo " This is useful if you want to use a catchall regex e.g. .* however some hosts lack a metric" exit 1 fi RESULT=`curl -s -g "${GANGLIA_URL}?${CHECK_ARGS}"` EXIT_CODE=`echo $RESULT | cut -f1 -d'!'` REST=`echo $RESULT | cut -f2 -d'!'` for x in $EXIT_CODE; do case $x in OK) echo $REST exit 0;; WARNING) echo $REST exit 1;; CRITICAL) echo $REST exit 2;; *) echo $REST exit 3;; esac done

你能夠下載源碼:https://www.ixdba.net/jk/ganglia_shell.tar.gz

這裏主要看下此文件第一行「GANGLIA_URL」的內容,這個變量用於指定http方式訪問check_host_regex.php腳本的路徑,後面跟的URL只要服務器自己可以訪問到便可。默認是http://localhost, 表示centreon服務器和gmetad服務器在一塊兒,若是centreon服務器和gmetad服務器不在一塊兒的話,那麼就須要修改GANGLIA_URL的值爲centreon服務器的地址。咱們這裏修改成:

GANGLIA_URL=http://172.16.213.157/ganglia/nagios/check_host_regex.php。

從腳本內容看,check_host_regex.sh主要用於對獲取的監控數據進行判斷,而check_host_regex.php腳本主要用來獲取監控數據。check_host_regex.php腳本在ganglia web安裝包中自帶,所以這裏不在講述。

下面介紹check_host_regex.sh腳本的用法。直接在命令行執行check_host_regex.sh腳本,便可顯示詳細用法,例如:

[root@centreonserver plugins]# ./check_host_regex.sh Sample invocation ./check_host_regex.sh hreg=Hostname checks=load_one,more,1:load_five,more,2 ignore_unknowns=0 Set ignore_unknowns=1 if you want to ignore hosts that don't posses a particular metric.

下面介紹其中各個參數的意義。

 hreg:後面跟主機名或主機名標識。這個參數的含義與check_ganglia_metric.php腳本中「hostname」參數的含義相同,但用法稍有不一樣。若是在hreg後面指定一個完整的主機名,那麼就收集此臺主機的狀態信息。同時,hreg參數還支持正則表達式,只需提供一個主機名的標識,就能夠批量檢測包含此標識的全部主機,例如,有800臺主機,主機名都包含有「bestjob」這個字符,那麼只需設置「hreg=bestjob」便可實現一個腳本一次檢查800臺主機的服務狀態。

 checks:後面跟檢測服務的指標值、檢查條件和告警閥值。常見的服務指標有load_one、disk_free、swap_free、part_max_used等,檢查條件有more(大於)、less(小於)、equal(等於)、notequal(不等於)四種,告警閥值根據實際應用環境來設置。這個參數還有個功能就是能夠一次設置多個服務狀態,每一個服務之間用「:」進行分割便可。有了這個功能,就能夠經過一個腳本一次檢測多個服務的運行狀態,大大提升了腳本檢測的效率。

 ignore_unknowns:此參數用來設置是否忽略UNKNOWN狀態的服務。設置此參數爲1表示忽略UNKNOWN狀態的服務,反之,設置爲0表示不忽略。

下面演示一下此腳本的用法,這裏以檢測主機名含有」bestjob「標識的主機爲例,操做過程以下:

[root@centreonserver plugins]# ./check_host_regex.sh \

hreg=bestjob checks=load_one,more,15
Services OK = 796, CRIT/UNK = 4 ;
CRITICAL host0089.bestjob.com load_one = 16.96,
CRITICAL host0133.bestjob.com load_one = 22.91,
CRITICAL host0028.bestjob.com load_one = 15.02,
CRITICAL host0329.bestjob.com load_one = 16.68
此命令用來檢測主機名含有」bestjob「標識的主機1分鐘內的負載狀態,當負載超過15時進行告警通知。從輸出可知,主機名含有」bestjob「標識的主機共有800臺,其中4臺主機在一分鐘內的負載狀態超過15,並給出了超載主機的主機名和當前的負載狀態值。

下面是一個腳本檢測多臺主機的多個服務的用法,操做過程以下:

[root@centreonserver plugins]# ./check_host_regex.sh \

hreg=bestjob checks=load_one,more,15:disk_free,less,900 ignore_unknowns=1
Services OK = 787, CRIT/UNK = 13 ;
CRITICAL host0081.bestjob.com load_one = 25.51 ,
CRITICAL host0246.bestjob.com load_one = 16.86 ,
CRITICAL host0003.bestjob.com disk_free = 576.318 GB,
CRITICAL dbmysql.bestjob.com disk_free = 520.721 GB,
CRITICAL webapp.bestjob.com disk_free = 461.966 GB,
CRITICAL host0200.bestjob.com disk_free = 852.420 GB,
CRITICAL host0055.bestjob.com disk_free = 279.465 GB,
CRITICAL dbdata.bestjob.com disk_free = 636.190 GB,
CRITICAL webui.bestjob.com disk_free = 525.538 GB,
CRITICAL server0232.bestjob.com disk_free = 861.330 GB,
CRITICAL server0159.bestjob.com disk_free = 801.443 GB,
CRITICAL host0080.bestjob.com disk_free = 739.467 GB,
CRITICAL etlserver.bestjob.com disk_free = 826.477 GB

此命令檢測含有」bestjob「標識在主機1分鐘內的負載狀態和剩餘空閒磁盤空間狀況,並忽略UNKNOWN狀態的服務。從檢測結果中發現,在800臺主機中,有13臺主機出現負載或磁盤空閒空間告警問題,並輸出了詳細的告警信息。

最後,還須要將此腳本集成到Centreon平臺上,以實現主機和服務的批量監控與批量報警。集成方法與上節介紹的集成check_ganglia.py的方法徹底相同。

首選將check_host_regex.sh腳本放到/usr/lib64/nagios/plugins目錄下,而後受權:

[root@localhost plugins]# chmod 755 check_host_regex.sh

接着,在Centreon Web界面,選擇 Configuration—>Commands—>Checks,而後點擊Add新建一個Command,以下圖所示。

這裏注意,「Enable shell」要選擇啓用。

而後,在Centreon Web界面選擇Configuration—>Services—>Services by host,點擊Add添加一個主機組服務,以下圖所示。

這裏注意命令的引用以及命令中監控參數的寫法。其中,「172」是引用的參數,表示以172開頭的全部主機。「part_max_used,more,95」表示對磁盤分區最大佔用空間作監控,當某分區或磁盤空間佔用率超過95%,那麼就告警。

在完成腳本集成後,重啓Centreon服務,便可實現主機和服務的批量監控與報警,經過批量的方式監控主機狀態。對於500臺以上主機的運維環境來講,若是須要監控100個服務,那麼每一個腳本監控20個服務,5個腳本執行1次便可完成全部主機服務狀態的監控,大大減小了腳本的執行次數,同時每一個腳本的執行時間也不會顯著加長。實踐證實,經過批量監控的方式基本解決了大運維環境下的監控報警性能問題。

下圖是Centreon在批量監控下的一個運行狀態截圖,經過此圖能夠清晰地看出哪些主機出現了告警問題,以及服務上次檢測的時間和下次檢測的時間。

至此,在Centreon中實現批量數據收集和監控報警的方法已經介紹完畢。整體來講,都是藉助現有的腳本稍做修改實現的,整個過程比較簡單。

相關文章
相關標籤/搜索