[FrontPage] [TitleIndex] [WordIndex

This is a read-only archived version of wiki.centos.org

在 CentOS 4.x/5.x 上安裝 Nagios

<!> 2010 年 7 月 28 日新增的備註:這篇文章似乎已被遺棄、不被維護、並且只提及某個通用的 nagios 版本。2012 年 10 月 11 日附加:此篇文章應以對話方式來重寫

<<TableOfContents: execution failed [Argument "maxdepth" must be an integer value, not "[2]"] (see also the log)>>

這篇文檔會快速地安裝及設定 Nagios 開始運作時所需的一切。它不會深入研究 Nagios 所採用的設定指令。這方面的文檔已收錄在 Nagios 的網站,又或者在安裝 Nagios 後收藏在本機裡。我將會解釋如何透過 RPM 及 yum 從 Dag 的軟件庫(RPMforge)進行安裝,但假若你寧可建立自己的版本,源代碼亦垂手可得。同樣地,這方面的文檔亦隨處可尋。如果你不懂得如何啟用軟件庫,請參考 CentOS wiki 裡的 Repositories 頁內的「第三方軟件庫」部份。這裡亦假設你已經在你的網絡上有一個運作中的電郵伺服器。它是發放通報的途徑,並且超越了這裡的範疇。

1. 系統:

2. 參考:

3. 套件:

其它:

4. 一般升級

有關升級的一個便條。一般來說,升級時只需輸入 yum update <套件名稱>。 但為安全起見,請在升級前把你在 /etc 的設定檔備份。第二,務請閱讀發行注記來確定設定檔及指令沒有改變。

4.1. 升級自 2.4

有關升級的一個便條。假若你升級自 2.4(或之前的 2.x 版本),而你是按照這份引南來安裝的,那麼簡單地執行 yum upgrade 便可以了。一如既往,請將你的設定備份才進行升級,以避有問題發生。另外,由 2.4 升級至 2.5 發行版,Dag 只把 nagios 及 nagios-devel 套件重建。

[me@mymachine ~] yum update nagios nagios-plugins nagios-devel nagios-plugins-nrpe

4.2. 升級自 2.5

如果你是由 2.5 版升級至 2.6,Dag 的 RPM 有些奇怪。請確保你已經將 /etc/nagios 備份,然後才繼續。

[me@mymachine ~] service nagios stop
[me@mymachine ~] cp -ar /etc/nagios /wherever/nagios_2.5_backup
[me@mymachine ~] yum update nagios nagios-plugins nagios-devel nagios-plugins-nrpe

假若 cgi.cfg、misccommands.cfg 或 checkcommands.cfg 並不存在或裡儲存為 .rpmsave 或 .rpmnew,請從你剛建立的備份裡複製它們回來。要不然,請忽視上述所提及的錯誤,因為這些 RPM 已經被修復了。多謝 Dag!此外,在貢獻的插件裡, check_linux_raid.pl 這個腳本有一個錯誤。修正這個問題很簡單。同樣,假若你執行這個插個時沒有問題,它已經被修正了。我是從 Nagios 的郵件列表得悉這個問題的。有一位用戶發現它並匯報了給包製者,因此現在它應該已經被解決。無論如何,要修正 check_linux_raid.pl:

[me@mymachine ~] vim /usr/lib/nagios/plugins/contrib/check_linux_raid.pl
將第 26 行註譯掉:
use strict;
#use lib utils.pm
use utils qw(%ERRORS);

[me@mymachine ~] nagios -v /etc/nagios/nagios.cfg
[me@mymachine ~] service nagios start

5. 設置 Apache

請確定你已經安裝了 Apache,然後你需要快捷地設定它。你很大機會已經在你的機器上運行著某些網頁服務,要不然,你可以這樣進行快速設定。

[me@mymachine ~] yum install httpd
[me@mymachine ~] vim /etc/httpd/conf/httpd.conf

最低限度請在 /etc/httpd/conf/httpd.conf 內把伺服器的名稱改為你的 IP 位置。然後請啟動 Apache,並確定它被設定為啟用的。

[me@mymachine ~] chkconfig httpd on
[me@mymachine ~] service httpd start

現在請開啟瀏覽器並看看你的網頁伺服器是否在運作中:http://localhost(或你的 IP 位址)。你應該會看見 Apache 2 的測試頁。若然如此,請繼續。

如果你在設定 Apache 上需要更多協助,尤其是你需要一台安全的伺服器,請遵照 http://www.apache.org 內的文檔。我只想警告你,以上做法可以快捷地令你的網頁伺服器運作,但未有提供任何安全性。假若你將會完全在內部運作,這並不是甚麼大問題。如了,當它可運作時,讓我們安裝 Nagios 並開始設置它。你將要安裝的 RPM 預設會建立一個 nagios.conf 供 Apache 用。這個檔案是 /etc/httpd/config.d/nagios.conf。

6. 安裝/設定

安裝需要安裝數個不同的套件,好讓它能在自己的專長上勝任。它的核心是 Nagios 這個套件本身。然而沒有插件,Nagios 便無沒在你的系統上進行任何檢查。開發用的套件當然包括了開發 Nagios 用的一切程式庫、標頭檔、及文檔。其它選擇性的套件包括 NRPE、與及我沒有採用的 NSCA(Nagios 服務檢查接納器)。你或許會用得著它,所以詳情請參閱它的主網站。還有,Nagios 必須以 nagios 這個用戶及群組下執行。RPM 安裝時會為你處理這個問題,因此你不必建立這個用戶或群組。

[me@mymachine ~] yum install nagios nagios-plugins nagios-plugins-nrpe nagios-devel

這樣亦會因應互賴性下載其它套件。這樣便安裝好了。讓我們再次返回 Apache 那邊。

6.1. 設定 Nagios 的 Apache 檔案

除非你想加入其它選項如設定 SSL 或只允許某些主機存取 CGI,要不然預設的 nagios.conf 已經能夠滿足你的需要。以下是它的內容:

ScriptAlias /nagios/cgi-bin "/usr/lib/nagios/cgi"
<Directory "/usr/lib/nagios/cgi">
#       SSLRequireSSL
        Options ExecCGI
        AllowOverride None
        Order allow,deny
        Allow from all
#       Order deny,allow
#       Deny from all
#       Allow from 127.0.0.1
        AuthName "Nagios Access"
        AuthType Basic
        AuthUserFile /etc/nagios/htpasswd.users
        Require valid-user
Alias /nagios "/usr/share/nagios"
<Directory "/usr/share/nagios">
#       SSLRequireSSL
        Options None
        AllowOverride None
        Order allow,deny
        Allow from all
#       Order deny,allow
#       Deny from all
#       Allow from 127.0.0.1
        AuthName "Nagios Access"
        AuthType Basic
        AuthUserFile /etc/nagios/htpasswd.users
        Require valid-user
</Directory>

除非你想設定其它選項,要不然便完成了。現在讓我們設定身份驗證。

6.2. 設置密碼檔

假若你不想使用 nagiosadmin 這個名稱,請以作為名字取代。請緊記稍後你在某些 CGI 的設定裡必需採用同一個名稱。

[me@mymachine ~] htpasswd -c /etc/nagios/htpasswd.users nagiosadmin
New password: 輸入你的密碼
Re-type new password: 重輸你的密碼
Adding password for user nagiosadmin

至於是否建立一個 guest 帳戶亦是你的決定。這個 guest 帳戶可以允許用戶檢視所在 Nagios 內指定的某些東西,但不會將整個 CGI 介面的存取權賦予他們。舉個例說,用戶可以看見主機的狀態,但無法為主機排期停機……如此類推。假如你想有一個 guest 帳戶,請建立它。

[me@mymachine ~] htpasswd /etc/nagios/htpasswd.users guest
New password: 輸入你的密碼
Re-type new password: 重輸你的密碼
Adding password for user guest

註:請留意我取掉 -c 這個選項。這是「建立」的選項。因為你已經建立了該檔案,請確保你新增其它帳戶時都不採用「建立」這個選項。要不然你便會清除這個檔案的內容。

6.3. 設置 CGI 檔案

下一步是在主要的 CGI 設定檔內設定你剛建立的用戶。我將會假設你沒有採用 guest 帳戶,並且單單建立一個 nagiosadmin 的管理員帳戶。另外,請確保你已設定採用身份驗證。1 代表啟用,0 代表停用。

[me@mymachine ~] cd /etc/nagios
[me@mymachine nagios] vim cgi.cfg

# AUTHENTICATION USAGE
use_authentication=1

# SYSTEM/PROCESS INFORMATION ACCESS
authorized_for_system_information=nagiosadmin

# CONFIGURATION INFORMATION ACCESS
authorized_for_configuration_information=nagiosadmin

# SYSTEM/PROCESS COMMAND ACCESS
authorized_for_system_commands=nagiosadmin

# GLOBAL HOST/SERVICE VIEW ACCESS
authorized_for_all_services=nagiosadmin
authorized_for_all_hosts=nagiosadmin

# GLOBAL HOST/SERVICE COMMAND ACCESS
authorized_for_all_service_commands=nagiosadmin
authorized_for_all_host_commands=nagiosadmin

當你完成編輯後,請儲存這個檔案。它還有很多選擇性的參數可供改變或試用,因此請享受把網頁介面自訂至你喜歡的樣式。讓我們試試你現時已經成就的一切。請重新啟動 Apache 並瀏覽至 http://localhost/nagios/。當你輸入了剛建立的憑證後,便應該看見一個漂亮的 Nagios 網頁介面。你可以瀏覽位於左邊的連結,但它們大部份都未能被應用,因為現時仍未進行任何設定。

6.4. 設置 nagios.cfg

只要檢查 /etc/nagios,便會發現有數個設定檔可供參閱。其中一個是 localhost.cfg。這個檔案以一個全包的方式來設定之後的物件檔。我覺得這樣很混亂,尤其是當你最終要監視大型的網絡。取而代之,你要將設定分割至不同檔案,這樣能排除你日後的煩惱。現在請遷移這個檔案。以往,範例檔名叫 bigger.cfg 及 minimal.cfg,但由 Nagios 2.9 起就只有單一個檔案。

[me@mymachine ~] cd /etc/nagios
[me@mymachine nagios] mv localhost.cfg localhost.cfg_org

現在我們將會開啟 Nagios 的主設定檔。內置的註釋基本上令這個檔案不言自明。假若你想的話,Nagios 允許你在單一個檔案 localhost.cfg 內指定所有設定。當你只須監視數個主機及服務,這是一個合理的主意,但當你需要監視大量事項,這便是個壞主意。單單適應如何設置 Nagios 便要花費你好一段時間,因此請幫自己一個忙,並按照以下提及的類別把檔案分類。意思即是:主機及主機群組放在一個檔案,服務及服務群組放在另一個檔案,而任何其他設定再放在另一個檔案。日後你會感激我。讓我們從基礎開始。我啟用了外部指令這個選項,好讓指令可以透過 CGI 網頁介面來執行。

[me@mymachine nagios] vim nagios.cfg

# 物件設定檔
cfg_file=/etc/nagios/contactgroups.cfg
cfg_file=/etc/nagios/contacts.cfg
cfg_file=/etc/nagios/hostgroups.cfg
cfg_file=/etc/nagios/hosts.cfg
cfg_file=/etc/nagios/services.cfg
cfg_file=/etc/nagios/timeperiods.cfg

# 外部指令選項
check_external_commands=1

# 外部指令檢查間隔
command_check_interval=1

請儲存這個檔案。現在,你需要建立上述所指定的每個檔案,因為它們並不存在於 /etc/nagios 內。

[me@mymachine nagios] touch contactgroups.cfg contacts.cfg hostgroups.cfg hosts.cfg services.cfg timeperiods.cfg
[me@mymachine nagios] chown nagios.nagios contactgroups.cfg contacts.cfg hostgroups.cfg hosts.cfg services.cfg timeperiods.cfg

這部份還有一件事要注意。如果你計劃在 CGI 介面上執行外部指令(check_external_commands),你可能會碰到不少權限上的問題。假若你在網頁介面執行某個指令時遇到任何錯誤,請查閱 Nagios 的常見問題集。該常見問題集收錄在這裡:http://nagios.sourceforge.net/docs/2_0/commandfile.html

7. 物件設定檔

先前提及,當設定檔被分開時,Nagios 會閱讀這些檔案內的資料來處理整個網絡的主機及服務。我事先一提,關於以範本為基礎的物件,它們所有選項的詳細文檔都已放置在網站裡。不過下面可助你起步,因此讓我們由 timeperiods 檔案做起。當然,你可以按所需將不同數值代入選項。

7.1. Timeperiods

[me@mymachine nagios] vim timeperiods.cfg

# '24x7' 時段的定義
define timeperiod{
        timeperiod_name 24x7
        alias           24 Hours A Day, 7 Days A Week
        sunday          00:00-24:00
        monday          00:00-24:00
        tuesday         00:00-24:00
        wednesday       00:00-24:00
        thursday        00:00-24:00
        friday          00:00-24:00
        saturday        00:00-24:00
        }

# 'workhours' 時段的定義
define timeperiod{
        timeperiod_name workhours
        alias           "Normal" Working Hours
        monday          08:00-17:00
        tuesday         08:00-17:00
        wednesday       08:00-17:00
        thursday        08:00-17:00
        friday          08:00-17:00
        }

# 'nonworkhours' 時段的定義
define timeperiod{
        timeperiod_name nonworkhours
        alias           Non-Work Hours
        sunday          00:00-24:00
        monday          00:00-09:00,17:00-24:00
        tuesday         00:00-09:00,17:00-24:00
        wednesday       00:00-09:00,17:00-24:00
        thursday        00:00-09:00,17:00-24:00
        friday          00:00-09:00,17:00-24:00
        saturday        00:00-24:00
        }

# 'none' 時段的定義
define timeperiod{
        timeperiod_name none
        alias           No Time Is A Good Time
        }

你可以隨喜設定不同數量的定義。譬如說你需要單單在週末才聯絡一些人。你可以建立一個 weekends 的範本,並按需要單單在 Friday、Saturday 及 Sunday 指定適當的時間。

7.2. 聯絡/聯絡群組

聯絡資料將會被分拆到兩個檔案。一個放置實際的聯絡選項,而另一個存放群組及當中的聯絡人。之後你會透過群組指定 Nagios 要聯絡誰。

[me@mymachine nagios] vim contacts.cfg

# service_notification_options are w,u,c,r,f,n
# w=warning u=unknown c=critical r=recovery f=flapping n=none
# host_notification_options d,u,r,f,n
# d=down u=unreachable r=recovery f=flapping n=none

define contact{
        contact_name                    me
        alias                           me
        service_notification_period     24x7
        host_notification_period        24x7
        service_notification_options    c,r
        host_notification_options       d,r
        service_notification_commands   notify-by-email
        host_notification_commands      host-notify-by-email
        email                           me@myemailaddress.whatever
        }

define contact{
        contact_name                    you
        alias                           you
        service_notification_period     workhours
        host_notification_period        workhours
        service_notification_options    c,r
        host_notification_options       d,r
        service_notification_commands   notify-by-email
        host_notification_commands      host-notify-by-email
        email                           you@youremailaddress.whatever
        }

你可按自己的喜好來選擇,但於我而言,我只會為關鍵性及復原的警報設立要通知聯絡人。我委實沒興趣收到那些受監視的東西因為臨時故障或警告狀態而發出的警報,尤其是在零晨四時。我沒有興趣是因為(一)我在日間經常檢查 Nagios 的 CGI 介面,而且(二)我的一切警報都會被轉送到傳票系統。話雖說此,我也不希望每次某個插件無法執行時都產生一張不必要的傳票。要是我真的有意興,我大可以設立一個獨立的聯絡單位及群組,單單接收警告及未知的警報,然後將它們導向另一別電郵地址。再一次,它們都可按你的需要而改變。還有,我只應用電郵。我的電郵系統可以代辦分發警報到目的地。不過,你可以設定 nagios 將訊息直接導向傳呼器。同樣的,請在文檔裡查閱 timeperiods.cfg 內的物件設定選項。假若你檢視用來通傳警報的指令,請查閱 /etc/nagios/misccommands.cfg。讓我繼續看聯絡群組。

[me@mymachine nagios] vim contactgroups.cfg

# einsteins 聯絡群組的定義
define contactgroup{
        contactgroup_name       einsteins
        alias                   einsteins
        members                 me,you
        }

這是聯絡人及聯絡群組的一個簡單範例。你可以按喜好設置多重巢套。你也可按需要不斷建立聯絡人。做法是很簡單。

7.3. 主機及主機群組

主機及主機群組的資訊分別被儲存在 hosts.cfg 及 hostgroups.cfg 這兩個檔案內。正如你可以在各個聯絡群組內配搭不同的聯絡人,你對主機及主機群組亦可以做同樣的事情。我較喜歡在設定檔內建立一個範本設定,其後從它取得設定值。長遠來說,這樣做可以為你節省大量打字的時間。

[me@mymachine nagios] vim hosts.cfg

# 通用主機的定義
define host{
        name                            generic-host    ; 通用範本的名稱
        notifications_enabled           1               ; 啟用主機通報
        event_handler_enabled           1               ; 啟用主機事件處理器
        flap_detection_enabled          1               ; 啟用擺動偵測
        process_perf_data               1               ; 處理效能數據
        retain_status_information       1               ; 程式重新起動時保留狀態資訊
        retain_nonstatus_information    1               ; 程式重新起動時保留非狀態資訊
        register                        0               ; 不註冊這個定義 —— 它不是真實的主機,只是個範本!
        }

# 這裡會建立一個可供其它主機應用的通用範本
# 永不通報、檢查 15 次後才在 CGI 介面上顯示嚴重警報

define host{
        name                    basic-host
        use                     generic-host
        check_command           check-host-alive
        max_check_attempts      15
        notification_interval   0
        notification_period     none
        notification_options    n
        register                0
        }

# 這裡會建立一個可供你的路由器應用的通用範本
# 24x7 監視主機、停機或復原時發出通報、檢查 15 次後進入嚴重狀態、
# 每隔 30 分鐘通知 contact_group

define host{
        name                    your-routers-host
        use                     generic-host
        check_command           check-host-alive
        max_check_attempts      15
        notification_interval   30
        notification_period     24x7
        notification_options    d,r
        register                0
        }

define host{
        use                     basic-host
        host_name               mymachine1
        alias                   mymachine1
        address                 192.168.100.101
        contact_groups          einsteins
#       notification_options    d,r  #overrides the basic-host option
        }

define host{
        use                     your-routers-host
        host_name               router1
        alias                   router1
        address                 192.168.100.100
        contact_groups          einsteins
        }

你可看見預設的範本長遠來說如何能助你節省時間。我現時在監視大約 100 台主機及超過 200 個服務,因此應用範本的方法的確能把效率提升。這樣做或許會出現混亂,但你照著文檔做但很快學曉。當你需要找出每個檔案所支援的一切範本物件,請查閱這裡 http://localhost(or your IP)/nagios/docs/configobject.html 。它能大大幫助你,因為 Nagios 提供太多選項給你選擇。我分開用不同範本,因為我想 your-routers-host 發出通報,但不想要 basic-host 容器的通告。假若你想置換 basic-host 容器的通報設定,你只須在主機的定義中指定便成了。你開始明白為何要採用範本吧?

有些人認為我在這裡的邏輯很亂,但它可以省掉你打字的功夫。如果你只需監視數台主機,這樣可能是多此一舉。好了,現在讓我們看主機群組。

[me@mymachine nagios] vim hostgroups.cfg

define hostgroup{
        hostgroup_name  basic-clients
        alias           basic clients
        members         mymachine1
        }

define hostgroup{
        hostgroup_name  your-routers
        alias           routers
        members         router1
        }

事情沒可能更簡單的了。你只須把來自 hosts.cfg 的客戶端組成主機群組放進在這個檔案內。你可以將它們分開成為多個群組。譬如說,我可選擇把 mymachine1 同時放在 basic-clients 及 your-routers 群組內。簡單得很……

7.4. 服務

開始時,你需要最少一個服務來監視。它也許是簡單的 check-host-alive、或 ping。同樣地,你可如上述所示範般把設定分配到範本來簡化日後的工作。

[me@mymachine nagios] vim services.cfg

# 通用服務定義的範本
define service{
        name                            generic-service ; 通用服務名稱
        active_checks_enabled           1               ; 啟用主動式服務檢查
        passive_checks_enabled          1               ; 啟用/接納被動式服務檢查
        parallelize_check               1               ; 同步執行主動式服務檢查(切勿停用)
        obsess_over_service             1               ; 追捕這個服務(有需要時)
        check_freshness                 0               ; 預設不要檢查服務的「新鮮度」
        notifications_enabled           1               ; 啟用服務通報
        event_handler_enabled           1               ; 啟用服務事情處理器
        flap_detection_enabled          1               ; 啟用擺動偵測
        process_perf_data               1               ; 處理效能數據
        retain_status_information       1               ; 程式重新起動時保留狀態資訊
        retain_nonstatus_information    1               ; 程式重新起動時保留非狀態資訊
        register                        0               ; 不註冊這個定義 —— 它不是真實的服務,只是個範本!
        }

# 通用於有服務的
define service{
        use                             generic-service
        name                            basic-service
        is_volatile                     0
        check_period                    24x7
        max_check_attempts              15
        normal_check_interval           10
        retry_check_interval            2
        notification_interval           0
        notification_period             none
        register                        0
        }

define service{
        use                             basic-service
        name                            ping-service
        notification_options            n
        check_command                   check_ping!1000.0,20%!2000.0,60%
        register                        0
        }

define service{
        use                             ping-service
        service_description             PING
        contact_groups                  einsteins
        hostgroup_name                  basic-clients,your-routers
#       host_name                       one_client
        }

這是建立巢套範本的例子。你可以獨立採用 hostgroup_name 或 host_name。我定義了一個名叫 basic-service 的通用範本,它從上面定義的 generic-service 定義取得設定值。然後 ping-service 就進一步為它加入設定值。看作出如此分割是由於你也許會想建立另一個名叫 your-switches 的主機群組,但你想把這個服務的通報發放給另一個聯絡群組。那麼你只需定義另一個服務,然後把這個主機群組加進該定義,並應用另一個聯絡群組。總而言之,最後一個定義取代對上所有容器的相同設定值。Nagios 會以最後看見的選項設定值為準。舉個例說,ping-service 保持不變,但我想它通報另一個聯絡群組。邏輯與 hosts.cfg 及 hostgroups.cfg 檔案內所描述的相同。

define service{
        use                             ping-service
        service_description             PING
        contact_groups                  group2
        hostgroup_name                  your-switches
#       host_name                       one_client
        }

由於你可以設定各種檢驗,services.cfg 這個檔案可能會變得很累贅。譬如說,你可以透過 check_smtp 插件檢查 smtp 服務,check_http 插件檢查 http 服務,SNMP 插件檢查 dhcp、dns、等各樣事情。讓我在這裡給你一個檢查 smtp 服務的範例。

# SMTP —— 確保 SMTP 服務是可用的。
define service{
        use                             basic-service
        name                            smtp-service
        service_description             SMTP
        notification_interval           15
        contact_groups                  einsteins
        notification_options            c,r
        notification_period             24x7
        check_command                   check_smtp
        register                        0
        }

define service{
        use                             smtp-service
        hostgroup_name                  smtp-servers
#       host_name                       one_client
        }

很明顯的,這裡再次應用了上述的範本,然後定義實際的主機群組作檢查。smtp-servers 這個主機群組必須存在於 hostgroups.cfg 內,而主機必須被定義在 hosts.cfg 內。

在我繼續之先,讓我對實際發生在這些檔案上的事情稍作解釋。Nagios 從所有文字檔案閱讀設定選項。當它要處理你所定義的 smtp-service 時,便會檢查它應該執行的 check_command 是甚麼。在這裡是:

# check_smtp 指令的定義
define command{
        command_name    check_smtp
        command_line    $USER1$/check_smtp -H $HOSTADDRESS$
        }

它會說:「太好了,我找到了!」現在 Ngios 會進到 /usr/lib/nagios/plugins/(RPM 安裝的預設路徑)並執行它在裡面所找到的 check_plugin 插件。它會以主機群組內的主機替代 $HOSTADDRESS$,然後檢查伺服器上的 SMTP 是否在運行中。收到「是」或「否」的答覆後,Nagios 會按照你在設定檔內指定的選項來處理這筆資料,然後在 CGI 介面顯示資訊。

這便是著手設置 Nagios 的精髓。我簡化了不少,但你現在至少應該理解在哪裡開始設定主機和服務。請檢視 /usr/lib/nagios/plugins 來看看一切隨機可用的東西。這裡藏有大量不同性質的東西。此外,請瀏覽 http://www.monitoringexchange.org 來查看由很多社內的成員所編寫的各種第三方插件。我透過 SNMP 進行很多檢查,因此請查閱它。另外,你可以簡單地編寫插件供自己應用。你還可以利用 Nagios 做很多額外的事情,例如定義警戒升級及延伸服務/主機資訊。當你啟動 Nagios 後,我會解釋它們是甚麼。

8. 啟動 Nagios

此刻,你應該已經有一、兩個主機設定可供監視之用。由於我們仍未進行以下步驟,讓我們啟動 Nagios 常駐程式,設定它在開機時啟動,並檢查設定檔是否有錯。

[me@mymachine nagios] chkconfig nagios on
[me@mymachine nagios] nagios -v nagios.cfg

Nagios 2.4
Copyright (c) 1999-2006 Ethan Galstad (http://www.nagios.org)
Last Modified: 05-31-2006
License: GPL

Reading configuration data...

Running pre-flight check on configuration data...

Total Warnings: 85
Total Errors:   0

Things look okay - No serious problems were detected during the pre-flight check

[me@mymachine nagios] service nagios start

Starting network monitor: nagios

你或許留意到我的實例顯示有 85 個警告。這是由於我有 85 個被檢查的服務是沒有相關的聯絡群組的。警告一般都可以被略過。只要檢查(nagios -v)的結果說 Things look okey,你便多數沒有問題。要避免有警告,你只須依照警告的內容把問題修正。

9. 警戒升級

警戒升級是一個很酷的方法讓你可以指定第二、三、四個等警報應該送往哪裡。舉個例說,你已設定每 30 分鐘檢查 SMTP 服務並不斷通知一個聯絡群組直至問題被解決。利用警戒升級,你可指定第二、三、四個警報被發送到某個電郵地址或傳呼機,而後第五、六、七個警報被發送到另一個電郵地址或傳呼機,如此類推。我廣泛地採用這個功能因為我將首個警報送往傳票系統,然後設定其餘的警報被送往一個傳呼機。我不希望同一個事故產生多張傳票,但我想 Nagios 不厭其煩地傳呼我直至我對事件作出反應。讓我們看一看。這裡假設你已經在 nagios.cfg 內加入這個檔案,並且在 /etc/nagios 內建立了它。

[me@mymachine nagios] vim escalations.cfg
define serviceescalation{
        host_name               mymachine1
        service_description     SMTP
        first_notification      1
        last_notification       0
        notification_interval   30
        contact_groups          mypager
        }

我在同一個檔案內一併定義主機警戒升級及服務警戒升級。正如其它事情,你可以把它們一分為二。你只需在 nagios.cfg 檔內把檔案的位置告訴程式。我沒有分拆它們,因為我需要升級的警戒並不多。你的處境也許會有所不同。

10. 延伸資訊

延伸資訊是一個贈送的功能,主要是用來美化網頁介面。它可以分為主機的延伸資訊及服務的延伸資訊。透過它,你可以把漂亮的小圖示放在主機名稱旁邊、指向 Nagios 以外的連結、及「美化」地圖系統內的物件。我利用服務的延伸資訊來指向 nagios 外寄存的 MRTG 圖表連結。我會示範如何達至這個目的。請記得在 nagios.cfg 內指定這個檔案存在,並建立它。

[me@mymachine nagios] vim serviceextinfo.cfg
# yum 的定義
define serviceextinfo{
        host_name               yum
        service_description     PING
        notes_url               http://mynagiosbox/mrtg/myfile.html
        icon_image              graph.gif
        icon_image_alt          View graphs
        }

這樣會在網頁介面裡把一個可愛的小圖示放在 PING 服務旁邊。當你點擊這個圖示時,它會直接進入我在同一台機器上運行的 MRTG 圖表。在我的例子中,我接有一台內部的 yum 伺服器每晚透過 rsync 與鏡像同步。所有的乙太網流量都經由 MRTG 繪圖,然後 Nagios 指向它的一個連結來方便瀏覽。這個做法証實可以建立一個不錯的頻寬使用記錄,及其它東西。運用一點想像力,你可以做記錄、繒圖、及連結至差不都任何東西。例如,系統內的進程及已登入的用戶。

11. 依賴性

我採用的另一個檔案就是主機與及服務依賴性的選項。它所做的事情就是建立一系列的檢查然後才發出警報。舉個例說,我檢查一台非 Linux 伺服器的登入服務。在這台機器上我亦會檢查另外 15 個服務,但它們都靠賴成功地登入這台機器後才能進行這些檢查。當登入失敗時,我不希望 15 個服務同時出現故障並傳呼給我,因此我便建立一顆依賴性的樹。當登入失敗,唯有登入服務會發出警報……我只會收到一個警報,而不是數百萬個其它檢查的警報。你也可以套用這個功能到主機上。同樣地,請在 nagios.cfg 檔內指定該檔案,並建立它。

define servicedependency{
        host_name                       your_host
        service_description             LOGIN
        dependent_host_name             your_host
        dependent_service_description   another_service
        execution_failure_criteria      w,u,c
        notification_failure_criteria   w,u,c
        }

execution_failure_criteria 告訴 Nagios 它在 LOGIN 服務失效時應該做甚麼。意思就是當 login 處於警告、不明、或嚴重狀態時,another_service 甚至可以連服務都不必檢查。notification_failure_criteria 斷定向時不需發出警報。假若 login 檢查處於警告、不明、或嚴重狀態時,another_service 便不會發出任何警報。

當你加增、編輯、或建立了新的檔案後,請確保你執行 nagios -v nagios.cfg 這個選項。它會處理你的設定檔並在實際刷新服務前把它們檢查一遍。

12. SELinux

關於 SELinux 的小資料。我沒有採用它,因為在 4.x 下,它會打亂某些東西,而我仍未花時間來學曉它。我知道在 5 下,它應該已更成熟,所以請把它一試。當我測試這些指令在 CentOS 5 下是否可行時,我停用了 SELinux,因此假若你遇上任何奇怪的問題,請記得可能是 SELinux。CentOS 5.2 的 SELinux 中一個安全性功能阻止了 apache httpd 伺服器存取所需的 /var/nagios 檔案。在 CentOS 5.2 下的權宜之計是執行這個指令:

chcon -R httpd_sys_content_t /var/nagios

註:有用戶匯報在 CentOS 6 這個較新版的 CentOS,以下指令格式: {{{chcon -R --type=httpd_sys_content_t /var/nagios }}} 同樣可行。

13. 各位,大功告成了!

基本上,這裡總結了 Nagios 的應用。我差不多將一切都簡化了。盼望我已經用一個顯淺的方法來解釋事物。這個工具的文檔非常好,但它的數量導致很難知道從何著手。如果你需要管理一個網絡,我主張你運行 Nagios 來監視你的主機及服務(除非你喜歡其它工具)。它已不止一次挽回我的資訊科技部門。正如我先前所說,你要花費一段長時間才能熟練它,而且在開始時要摸透它實不容易,不過一旦你掌握了 Nagios,你會詫異自己如何渡過沒有它的日子。我的檢查由利用 ping 來測試主機是否在線,到磁碟使用狀況、記憶狀況、DHCP、DNS、HTTP、儀器室的温度、yum 更新、處理器負荷、主機的 SNMP 資訊、以及任何你可以想像的事情。我省略了很多事情,但你明白我的意思。事實上任何你想監視的東西都可以透過 Nagios 來達成。你可以編寫自己的插件,或瀏覽我先前所提及的 Monitoring Exchange 網站來找尋大致上任何東西。

還有一件事我想順帶一提,就是你可以完全透過網頁來設定及維護 Nagios。Nagios 並不包含一個預裝的插件作此用途,但你可以在這裡找到三款不同的套件:http://www.nagios.org/faqs/viewfaq.php?faq_id=183。我本人並未用過任何一款,但我相信對那些覺得指令行太困難的人,它們會有用武之地。

如果你想加添甚麼,或者發現有錯處,請告訴我,好讓我能作出修正。原稿是在 HTML 寫成的,因此我須要改寫格式來遷就這個 wiki,所以錯字也許難免。請享用。


由於 MaxHetrick 似乎已離開了 CentOS Wiki,因此現時任何有編輯權的人都平等地擁有本頁。曾經有人推薦這一頁作為份更「清晰」的教學文檔。

Translation of revision 30


2023-09-11 07:23