Centreon是一款功能強大的分佈式IT監控系統,它經過第三方組件能夠實現對網絡、操做系統和應用程序的監控:首先,它是開源的,咱們能夠無償使用它;其次,它的底層採用nagios做爲監控軟件,同時nagios經過ndoutil模塊將監控到的數據定時寫入數據庫中,而Centreon實時從數據庫讀取該數據並經過Web界面展示監控數據;,最後,咱們能夠經過Centreon管理和配置nagios,或者說Centreon就是nagios的一個管理配置工具,經過Centreon提供的Web配置界面,能夠輕鬆完成nagios的各類繁瑣配置。mysql
此外,Centreon還支持NRPE、SNMP、NSClient等插件,能夠經過這些插件構建分佈式的監控報警系統。ios
一個典型的Centreon監控系統通常有六大部分組成,分別是Centreon Web、centengine、Centreon Broker SQ、Centreon Broker RRD、centcore和cbmod,下面重點看看每一個組成部分是如何協調工做的,以下圖所示。web
對上圖的結構介紹以下:sql
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的實時狀態寫入數據庫,以供其餘程序去調用,最終能夠實如今一個控制檯上完成全部擴展節點的數據入庫操做。shell
Centreon的安裝有必定的複雜性,在安裝上有ISO鏡像安裝、VM虛擬機安裝、源碼編譯安裝和yum源安裝四種方式,源碼編譯安裝較複雜,出錯概率也較高,所以這裏推薦採用ISO鏡像安裝方式進行安裝。數據庫
從https://download.centreon.com/
下載須要的版本便可,這裏下載iso鏡像,使用最新的centreon-18.10-5.el7.x86_64版本。將下載下來的鏡像克隆成光盤,或者直接在虛擬機下以iso模式進行引導,便可開始安裝系統,其實這個iso鏡像就是一個centos操做系統鏡像,只不過系統中集成了centreon的安裝環境和安裝包,只要將操做系統安裝完成,那麼centreon也就安裝好了,能夠直接使用,這是最簡單的一種安裝方式。apache
下面簡單說下centreon的iso鏡像安裝過程。centos
將iso刻錄爲光盤或者U盤,而後引導,進行安裝,首先進入第一步,以下圖所示:瀏覽器
接着,選擇一種語言,以下圖所示:bash
語言選擇默認英文便可,而後點擊「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並不複雜,全部操做都能在web管理界面完成,若是對nagios的配置過程比較瞭解,那麼配置Centreon就變得很是簡單。下面先來熟悉一下Nagios中配置文件之間的關係。
在Nagios的配置過程當中涉及幾個定義:主機、主機組、主機模板,服務、服務組、服務模板,聯繫人、聯繫人組、監控時間和監控命令等,從這些定義能夠看出,Nagios的各個配置文件之間是互爲關聯,彼此引用的。成功配置一臺Nagios監控系統,必需要弄清楚每一個配置文件之間依賴與被依賴的關係,其中,最重要的有四點:第一要定義監控哪些主機、主機組、服務和服務組;第二要定義這個監控要經過什麼命令實現;第三要定義監控的時間段;最後要定義主機或服務出現問題時要通知的聯繫人和聯繫人組。
Centreon的配置邏輯和過程與Nagios徹底相同,所以,清楚了Nagios的配置重點和各個配置文件之間的依賴關係,Centreon的配置將變得比Nagios更加簡單。
在Centreon早期版本中,安裝完成後,會有一些初始的主機或服務的監控項,可是在centreon最新版本中,去掉了默認的主機,服務和模板,而是經過插件的形式提供模板、通知等基礎功能,但這並不影響咱們的學習和使用。
一、建立一個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下表示的含義徹底相同,這裏再也不過多介紹。
二、配置主機模板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」標籤,用來設置告警通知屬性模板,以下圖所示:
告警通知屬性主要是對是否啓用告警、告警聯繫人、告警週期、告警類型等進行設置,上圖已經很清楚的描述了每一個選項的含義,這裏再也不多說。
三、添加主機監控
選擇Configuration—>Hosts—>Hosts,點擊Add添加一個主機,以下圖所示。首先添加一個172.16.213.188主機,此主機無需設置更多的屬性,只須要引用模板便可,模板就選擇以前咱們建立的「generic-host」,這樣,此主機的全部屬性就配置完成了,由於更多的主機屬性都經過指定的主機模板繼承進去了。
固然,咱們也能夠在主機屬性中從新指定配置項,例如能夠在「Check
Command」項中添加一個新的用於檢測主機狀態的命令,這個命令定義之後,主機模板中定義的主機檢測命令就被覆蓋了。
要添加更多的主機,方法與上面徹底相同。下面依次添加多臺主機,以下圖所示:
在這個界面上,有不少操做屬性,能夠用於對主機進行復制、刪除、修改、啓用和禁用等,因而可知,經過Centreon管理主機很是方便和簡單。
四、添加主機組監控
選擇Configuration—>Hosts—>Host Groups,點擊Add添加一個主機組,以下圖所示,依次輸入「Host Group Name」和「Alias」的值,而後在「Linked Hosts」中選擇此主機組須要加入的主機便可,添加完畢,點擊「Save」便可完成主機組的添加。
當一批主機有某些相同的服務須要監控的時候,將這些主機添加到一個主機組中,而後建立一個須要監控的服務,將這個主機組加到此服務中,這樣就完成了對批量主機的某些相同服務的監控,省去了一個主機添加一個服務的麻煩,很是方便。
從上圖能夠看到,添加了一個名爲hostgroup1的主機組,而後將8臺主機添加到了這個組中。一個主機能夠屬於多個主機組。
添加一臺主機很是簡單,可是若是有成千上萬臺主機須要添加呢,一個個添加顯然是不行的,此時就須要經過批量添加主機的方法實現。這實際上是藉助於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 == print