一、 Centreon概述
Centreon是一款功能強大的分布式IT監控系統,它通過第三方組件可以實現對網絡、操作系統和應用程序的監控:首先,它是開源的,我們可以免費使用它;其次,它的底層采用nagios作為監控軟件,同時nagios通過ndoutil模塊將監控到的數據定時寫入數據庫中,而Centreon實時從數據庫讀取該數據並通過Web界面展現監控數據;,最后,我們可以通過Centreon管理和配置nagios,或者說Centreon就是nagios的一個管理配置工具,通過Centreon提供的Web配置界面,可以輕松完成nagios的各種繁瑣配置。
此外,Centreon還支持NRPE、SNMP、NSClient等插件,可以通過這些插件構建分布式的監控報警系統。
二、 Centreon的結構
一個典型的Centreon監控系統一般有六大部分組成,分別是Centreon Web、centengine、Centreon Broker SQ、Centreon Broker RRD、centcore和cbmod,下面重點看看每個組成部分是如何協調工作的,如下圖所示。
對上圖的結構介紹如下:
Centreon Web界面是基於Apache Web服務器,用來配置和展示。
centengine是Centreon的底層監控引擎,主要完成監控報警系統所需的各項功能,是Centreon監控系統的核心。另外,Centreon還支持Nagios、Icinga等監控引擎。這里介紹官方的centengine監控引擎。
Centreon Broker SQL將信息存儲到MariaDB數據庫,並將其轉發給Centreon Broker RRD。
Centreon Broker RRD使用數據生成和更新RRD文件,以顯示狀態、性能圖。
centcore主要用於centreon的分布式監控系統中,在系統中centcore是一個基於perl的守護進程,主要負責中心服務器(central server)和擴展節點(pollers)間的通信和數據同步等操作,例如centcore可以在中心服務器上執行對遠程擴展節點上centengine服務的啟動、關閉和重啟操作,還可以運行、更新擴展節點上的配置文件。
cbmod是將centengine與數據庫進行連接的工具,它可以將centengine的實時狀態寫入數據庫,以供其他程序去調用,最終可以實現在一個控制台上完成所有擴展節點的數據入庫操作。
三、安裝Centreon監控系統
Centreon的安裝有一定的復雜性,在安裝上有ISO鏡像安裝、VM虛擬機安裝、源碼編譯安裝和yum源安裝四種方式,源碼編譯安裝較復雜,出錯幾率也較高,因此這里推薦采用ISO鏡像安裝方式進行安裝。
從https://download.centreon.com/
下載需要的版本即可,這里下載iso鏡像,使用最新的centreon-18.10-5.el7.x86_64版本。將下載下來的鏡像克隆成光盤,或者直接在虛擬機下以iso模式進行引導,即可開始安裝系統,其實這個iso鏡像就是一個centos操作系統鏡像,只不過系統中集成了centreon的安裝環境和安裝包,只要將操作系統安裝完成,那么centreon也就安裝好了,可以直接使用,這是最簡單的一種安裝方式。
下面簡單說下centreon的iso鏡像安裝過程。
將iso刻錄為光盤或者U盤,然后引導,進行安裝,首先進入第一步,如下圖所示:
接着,選擇一種語言,如下圖所示:
語言選擇默認英文即可,然后點擊“Continue”進入下一步,如下圖所示:
在這個主界面下,可以對安裝系統進行各種設置,這里對安裝類型要進行選擇,點擊“Installation type”,進入如下界面:
這里有四個選項供選擇,分別是:
Central with database:表示安裝Centreon(Web界面和數據庫),監控引擎和代理。也就是完全安裝。
Central without database:安裝Centreon(僅限Web界面),監控引擎和代理。
poller:僅安裝輪詢器(僅限監視引擎和代理)。
database only:僅僅安裝數據庫服務器。
這里選擇第一個即可,然后點擊左上角的“Done”即可返回主界面,接着開始對磁盤進行分區設置,如下圖所示:
點擊“INSTALLATION DESTINATION”進行磁盤分區設置,如下圖所示:
這里選擇“ I will configure partitioning”,也就是自定義分區,然后點擊左上角的“Done”進入下一步,如下圖所示:
在這個自定義分區界面中,建議按照上圖的設置進行分區。分區完成點擊左上角的“Done”進入下一步,
根據提示,選擇“Accept Changes”返回主界面,接着,在主界面選擇“NETWORK &HOST NAME”進行主機名和網絡配置,網絡配置選擇手動配置靜態IP,如下圖所示:
網絡配置完成,保存退出,返回網絡和主機名配置界面,如下圖所示:
網絡配置完成后,點擊左上角的“Done”返回主界面,最后選擇主界面下的“DATE & TIME”進入時間和時區配置,如下圖所示:
時區選擇亞洲/上海即可,然后點擊左上角的“Done”返回主界面,至此,系統安裝配置全部完成,如下圖所示:
點擊“Begin Installation”開始安裝系統。
系統安裝完成后,系統里面集成的centreon服務會自動啟動,接着就可以初始化centreon配置了,打開瀏覽器訪問centreon服務地址:
通過URL登錄Centreon Web界面:http:// [SERVER_IP] /centreon。將顯示Centreon設置向導。如下圖所示:
這是centreon歡迎界面,單擊“ next”,如下圖所示:
繼續單擊“ next”,如下圖所示:
這些默認的配置都無需修改,直接單擊“ next”,如下圖所示:
繼續單擊“ next”,如下圖所示:
這里是設置centreon管理員用戶admin的密碼和用戶信息,手動輸入后,單擊“next”,如下圖所示:
這里只需要輸入數據庫用戶centreon的密碼即可,centreon用戶會自動創建。手動輸入后,單擊“next”,如下圖所示:
單擊“ next”,如下圖所示:
單擊“install”,安裝模塊和插件,如下圖所示:
單擊“ next”,如下圖所示:
安裝完成。單擊Finish。
四、配置Centreon監控系統
配置Centreon並不復雜,所有操作都能在web管理界面完成,如果對nagios的配置過程比較了解,那么配置Centreon就變得非常簡單。下面先來熟悉一下Nagios中配置文件之間的關系。
在Nagios的配置過程中涉及幾個定義:主機、主機組、主機模板,服務、服務組、服務模板,聯系人、聯系人組、監控時間和監控命令等,從這些定義可以看出,Nagios的各個配置文件之間是互為關聯,彼此引用的。成功配置一台Nagios監控系統,必須要弄清楚每個配置文件之間依賴與被依賴的關系,其中,最重要的有四點:第一要定義監控哪些主機、主機組、服務和服務組;第二要定義這個監控要通過什么命令實現;第三要定義監控的時間段;最后要定義主機或服務出現問題時要通知的聯系人和聯系人組。
Centreon的配置邏輯和過程與Nagios完全相同,因此,清楚了Nagios的配置重點和各個配置文件之間的依賴關系,Centreon的配置將變得比Nagios更加簡單。
4.1 添加主機和主機組
在Centreon早期版本中,安裝完成后,會有一些初始的主機或服務的監控項,但是在centreon最新版本中,去掉了默認的主機,服務和模板,而是通過插件的形式提供模板、通知等基礎功能,但這並不影響我們的學習和使用。
1、創建一個check_host_alive命令
監控命令(Commands)是Centreon分布式監控系統運行的基礎,無論是主機還是服務,都是通過監控命令完成狀態檢查和報警的。經常使用的監控命令分為兩種,分別是檢測(Check)命令和通知告警(Notification)命令。
在Centreon系統中,選擇Configuration—>Commands—>Checks,即可看創建監控檢測命令,選擇Configuration—>Commands—>Notifications,即可看到自帶的通知告警命令,例如常用的host-notify-by-email、service-notify-by-email等。
選擇Configuration—>Commands—>Checks,點擊add創建一個命令,如下圖所示:
其中,“Command Name”為check_host_alive;“Command Type”為“Check”;“Command Line”是命令的具體執行方式,命令中“$USER1$”是一個變量,其實就是nagios插件或centreon插件的存放路徑,“$HOSTADDRESS$”是個主機宏,用於取主機定義里的IP地址或者主機名,這些內容的含義與在Nagios下表示的含義完全相同,這里不再過多介紹。
2、配置主機模板generic-host
登錄centreon web,在左側導航中,選擇Configuration > Hosts >
Templates,然后點擊“add”按鈕,先創建一個模板文件,如下圖所示:
主機模板,顧名思義,是對主機默認屬性或通用屬性的設置。只有主機引用了這個模板,那么此模板的設置值就繼承到主機里面了。一些基礎的主機監控,比如主機檢查屬性、報警通知屬性、自定義宏屬性等都可以在主機模板中進行設置,當然也可以在定義主機監控的時候設置這些屬性。
主機模板的一個最大特點是繼承性,如果一個主機引用了這個模板,那么此主機模板下的所有監控屬性都被自動繼承過來了,例如要對1000台主機做ping連通性檢查,首先可以創建一個check_ping命令,然后將這個命令引用到generic-host模板中,最后在創建主機的時候,所有1000台主機都引用generic-host這個主機模板即可,引用主機模板的好處是,如果監控屬性發生了變化,只需修改generic-host配置即可,而無需一個主機一個主機的修改,方便快捷。
有時候可能會發現一個監控屬性既在generic-host模板中設置了,也在主機定義中設置了,此時就有一個優先級的問題,在這種情況下,監控屬性的生效值以主機中的設置為准。例如,已經在generic-host中設置了Check
Period為“24x7”,而在某主機的定義中也引用了generic-host模板,同時將Check Period設置改為“workhours”,那么此主機監控周期最終生效的設置是“workhours”。
在上圖可以看到一些主機檢查屬性值,例如,“Max Check Attempts” 表示最大檢查嘗試次數,“Normal Check Interval”表示正常檢查間隔,單位是分鍾,“Retry Check Interval”表示重試檢查間隔,單位是分鍾。這些主機檢查屬性值都需要根據實際情況進行修改或添加。
點擊上圖中的“Notification”標簽,用來設置告警通知屬性模板,如下圖所示:
告警通知屬性主要是對是否啟用告警、告警聯系人、告警周期、告警類型等進行設置,上圖已經很清楚的描述了每個選項的含義,這里不再多說。
3、添加主機監控
選擇Configuration—>Hosts—>Hosts,點擊Add添加一個主機,如下圖所示。首先添加一個172.16.213.188主機,此主機無需設置更多的屬性,只需要引用模板即可,模板就選擇之前我們創建的“generic-host”,這樣,此主機的所有屬性就配置完成了,因為更多的主機屬性都通過指定的主機模板繼承進去了。
當然,我們也可以在主機屬性中重新指定配置項,例如可以在“Check
Command”項中添加一個新的用於檢測主機狀態的命令,這個命令定義以后,主機模板中定義的主機檢測命令就被覆蓋了。
要添加更多的主機,方法與上面完全相同。下面依次添加多台主機,如下圖所示:
在這個界面上,有很多操作屬性,可以用於對主機進行復制、刪除、修改、啟用和禁用等,由此可見,通過Centreon管理主機非常方便和簡單。
4、添加主機組監控
選擇Configuration—>Hosts—>Host Groups,點擊Add添加一個主機組,如下圖所示,依次輸入“Host Group Name”和“Alias”的值,然后在“Linked Hosts”中選擇此主機組需要加入的主機即可,添加完畢,點擊“Save”即可完成主機組的添加。
當一批主機有某些相同的服務需要監控的時候,將這些主機添加到一個主機組中,然后創建一個需要監控的服務,將這個主機組加到此服務中,這樣就完成了對批量主機的某些相同服務的監控,省去了一個主機添加一個服務的麻煩,非常方便。
從上圖可以看到,添加了一個名為hostgroup1的主機組,然后將8台主機添加到了這個組中。一個主機可以屬於多個主機組。
4.2 批量添加主機
添加一台主機非常簡單,但是如果有成千上萬台主機需要添加呢,一個個添加顯然是不行的,此時就需要通過批量添加主機的方法實現。這其實是借助於Centreon的模板功能完成的,其基本原理是:先把批量主機的共同屬性添加到主機模板中,然后在批量添加主機時,引用這個主機模板即可。這樣在添加每個主機時不同的屬性只有IP地址和主機名,只要把這兩個值寫入數據庫即可完成主機的添加。
下面是一個寫好的批量添加主機的perl腳本:
#!/usr/bin/perl use strict; use warnings; use DBI; use DBD::mysql; # ---------------------------------------------------- my $DB_HOST = "127.0.0.1"; #監控服務器的IP地址,建議修改為127.0.0.1 my $DB_USER = "centreon"; # Centreon web安裝時設置的數據庫訪問用戶,默認為centreon my $DB_PASSWD = "centreon"; # Centreon web安裝時設置的數據庫密碼,這里為centreon my $DB_NAME = "centreon"; # Centreon web 對應的數據庫名,默認是centreon my $dbh = DBI->connect("DBI:mysql:database=$DB_NAME;host=$DB_HOST", "$DB_USER", "$DB_PASSWD", { RaiseError => 1 }); # ---------------------------------------------------- my $file_path = "/var/tmp/hosts"; #hosts模板文件,需要自己創建 my $tpl_name = "generic-host"; #主機模板,填寫批量添加的主機需要繼承的模板 my $nagios_name = "Central"; #poller,默認為Central foreach my $arg (@ARGV) { # == file of hostname and ipaddress == if ($arg eq '-f') { $file_path = shift; } # == name of template == elsif ($arg eq '-t') { $tpl_name = shift; } # == name of nagios name == elsif ($arg eq '-n') { $nagios_name = shift; } else { &print_help(); exit 1; } } # ----------------------------------------------------- open (HOST, "$file_path") || die "Cannot open $file_path for read"; my $sql; my $sth; my $line; my ($host, $ipaddr); my ($host_id, $tpl_id, $nagios_id) = (0, 0, 0); while (defined($line = <HOST>)) { # == skip blank lines ================= next if ($line =~ /^\s*$/); # == skip if # ======================== next if ($line =~ /^\s*#/); # == get host and ipaddress =========== ($ipaddr, $host) = split(/\s+/, $line); next if ($ipaddr eq '' || $host eq ''); # == insert the host to table host ==== $sql = "insert host set host_template_model_htm_id='2',host_name='$host',host_alias='$host',host_address='$ipaddr',host_active_checks_enabled='2',host_passive_checks_enabled='2',host_checks_enabled='1',host_event_handler_enabled='2',host_flap_detection_enabled='2',host_process_perf_data='2',host_retain_status_information='2',host_retain_nonstatus_information='2',host_notifications_enabled='2',host_register='1',host_activate='1'"; $sth = $dbh->do($sql); sleep(1); # == get host_id ====================== $sql = "select host_id from host where host_name='$host'"; $sth = $dbh->prepare($sql); $sth->execute(); while (my $ref = $sth->fetchrow_hashref()) { $host_id = $ref->{'host_id'}; print "host_id is $host_id\n"; } next if ($host_id == 0); # == insert extended_host_information == $sql = "insert extended_host_information set host_host_id='$host_id'"; $sth = $dbh->do($sql); # == insert host_template_relation ===== $sql = "select host_id from host where host_name='$tpl_name'"; $sth = $dbh->prepare($sql); $sth->execute(); while (my $ref = $sth->fetchrow_hashref()) { $tpl_id = $ref->{'host_id'}; print "template id is $tpl_id\n"; } next if ($tpl_id == 0); $sql = "insert host_template_relation set host_host_id='$host_id',host_tpl_id='$tpl_id',`order`='1'"; $sth = $dbh->prepare($sql); $sth->execute(); # == insert ns_host_relation =========== $sql = "select id from nagios_server where name='$nagios_name'"; $sth = $dbh->prepare($sql); $sth->execute(); while (my $ref = $sth->fetchrow_hashref()) { $nagios_id = $ref->{'id'}; print "Poller id is $nagios_id\n"; } next if ($nagios_id == 0); $sql = "insert ns_host_relation set host_host_id='$host_id',nagios_server_id='$nagios_id'"; $sth = $dbh->prepare($sql); $sth->execute(); # == insert complete ==