Nagios - 網路監控及告警系統

1、前言

Nagios 為功能非常強大的網路監控軟體,不僅可以監控主機 (本地端或遠端) 及服務更加入許多非常人性化的觀念進去,且還可自行依需求來撰寫當監控主機或服務發生問題時的反應動作,總之是個非常強大的監控軟體,建議可以購買 網路與伺服器監視軟體-Nagios入門與應用 這本書來看裡面對於 Nagios 有非常詳細的介紹。






文章目錄

1、前言
2、實作環境
3、安裝及設定
          步驟1.安裝 nagios 套件
          步驟2.修改 nagios 設定檔
          步驟3.修改 rc.conf
4、Me FAQ
          Q1.登入 Nagios 管理介面後隨便點選 item 出現錯誤訊息?
          Q2.無法使用管理介面的外部指令功能?
          Q3.送出外部指令後出現錯誤訊息?
          Q4.使用通知方式是 Mail 但未何都收不到 contact 通知?


Nagios 官網監控成果:

名詞及觀念: 在開始玩 Nagios 以前有些名詞跟觀念,若是先了解的話對於玩 Nagios 會更有幫助的。
  • 主機 (Host): 只要列入 Nagios 監視範圍內都視為主機 (ex. Router、Switch、Printer....)
  • 服務 (Service): 看您要針對該主機監視什麼服務 (ex. DNS、LDAP、Tomcat...)
  • 指令 (Command): 執行監視或通知聯絡人的動作稱之 (ex. check_ftp、check_http...)
  • 聯絡人 (Contact): 監控的主機或服務發生狀況時要通知誰
  • 群組 (Group): 因為有群組的概念讓 Nagios 具有更多彈性 (ex. 連絡人郡組、主機郡組、服務郡組...)
  • 外掛模組 (Plugin): 用來定義在 Command 設定檔內使 Nagios 來監控主機及服務稱之 (ex.check_ftp、check_http...) 可以自行視需求開發,當然也可以拿別人寫好現成的來使用
  • 狀態 (State): 簡單說 Nagios 監控後會回覆我們監控的結果以便後續的動作
  • 監控期間 (Time Period): 可以定義監控日期及每天 (例如上班日) 的時間 (例如上班時間)
  • 繼承 (Accede): 例如要監控二台主機的 Apache 服務不過不同的只有 IP 而以,這時可利用繼承的觀念讓我們把設定檔內容簡化維護起來也更容易

主機及服務狀態: Nagios 執行監控動作後會回報監控對象測試結果,所以對於監控對象的狀態我們也必須了解一下顯示的訊息所代表的意義。

主機狀態為:
  • OK: 主機運作正常
  • Unreachable: 監控的 ICMP 指令傳回無法到達,通常是網路出問題了
  • UP: 主機啟動中 (通常從 Down -> UP)
  • Down: 主機停止運作 (通常將監控對象剛加入時會為此狀態)

服務狀態為:
  • OK: 服務運作正常
  • Warning: 服務出現異狀 (但是可忽略的)
  • Critical: 服務出現問題 (需要立即處理)
  • Unknown: 服務狀態不明 (偵測不到?)

軟/硬 狀態: 以下將說明何謂軟狀態?何謂硬狀態?
  • 軟狀態 (Soft State): 如果監控動作失敗一次就通知聯絡人 (有時可能一次 Ping 不到就通知) 那聯絡人應該會忙死所以我們可以設定例如持續執行 Ping 的動作 5 次都不成功時 (這時通常主機有問題了) 再通知聯絡人,而這重試 (Retry) 動作的期間就稱之為軟狀態 (Soft State)
  • 硬狀態 (Hard State): 如上例所說當持續執行 Ping 的動作 5 次都不成功時這時狀態就變成硬狀態 (Hard State),這時可能就通知聯絡人或執行你設定的方式 (例如監控是Tomcat Service 則重新啟動該服務試試)

監控方式: Nagios 預設的監控方式是由 Nagios 主機去向監控對象發出要求然後被監控對象回應結果,但其實換個角度想這樣的方式是不是可以反過來,這樣的話 Nagios 的 Loading 就不會那麼大了 (如果你監控的機器有一狗票的話)。
  • NRPE (Nagios Remote Plugin Executor): Nagios --> 遠端主機,果要監控遠端主機的磁碟空間而不透過 SNMP Information 該如何達成? Nagios 使用在遠端機器 (Client) 上安裝 NRPE (Port 5666) 而 Nagios 本身運作 check_nrpe 來達成類似這樣的任務。
  • NSCA (Nagios Service Check Acceptor): 遠端主機 --> Nagios,跟 NRPE 不同的地方是 Nagios 是向遠端主機傳送要求,而 NSCA 則是遠端主機主動回動資訊給 Nagios。

通知: 當監控對象發生狀態時 (例如 Ping 不到監控對象超過 10 分鐘) 需要通知 (Notify) 管理者,不過 Nagios 可不是隨便就執行通知了而是一步一步的,整個通知的流程如下:
  1. 在 nagios.cfg 內 enable=notifications=1 才會進行通知的動作
  2. 監控對象的狀態是否處於 downtime (關機處理)
  3. 監控對象的狀態是否處於 flapping (一下 UP 一下 Down) 需配合 flap_detection_enabled
  4. 監控對象的狀態是否符合 notification_options 選項 (w,u,c,r)
  5. 監控對象的通知時間是否符合 notification_period 設定
  6. 監控對象的通知是否符合間隔時間 notification_interval 設定
  7. 聯絡人是否符合被通知的條件
  8. 執行通知的動作(視您所設定通知方式而定)





2、實作環境

  • FreeBSD 6.2-RELEASE-p5
  • nagios-2.9 
  • nagios-plugins-1.4.6,1





3、安裝及設定

步驟 1. 安裝 nagios 套件

切換至 Ports Tree 路徑下開始安裝 Nagios 套件,安裝過程中系統會自動建立 nagiso 系統使用者帳號及群組 (屆時用來啟動 Big Sister 服務用)。
cd /usr/ports/net-mgmt/nagios    //切換至安裝路徑
make install clean               //安裝並清除暫存檔案

主要設定檔存放路徑如下
 /usr/local/libexec/nagios/check_apt   //plugins 檔案
 /usr/local/etc/nagios                 //cfg 設定檔
 /usr/local/www/nagios                 //預設監控回報網頁




步驟 2. 修改 nagios 設定檔

預設的狀態下 localhost.cfg 設定檔內容就包含全部設定資訊了,不過若是您要監控的對象有一堆的時候建議還是把每個項目都獨立成一個設定檔,這樣對於日後維護上是比較好的作法,以下為將各監控項目都獨立成一個設定檔的功能說明 (在 /usr/local/etc/nagios 下皆有範例檔檔可自行複製後修改)。
 cgi.cfg              //指定網頁路徑、身份認證...等
 nagios.cfg           //主要核心設定檔 (指定 Log、要載入的設定檔...等)
 localhost.cfg        //預設監控本機的設定檔 (含所有功能)
 contacts.cfg         //定義聯絡人資訊
 contactgroups.cfg    //定義聯絡人郡組
 hosts.cfg            //定義監控主機資訊
 hostgroups.cfg       //定義監控主機郡組
 commands.cfg         //執行哪些指令及參數 (就是執行 plugins)
 resource.cfg         //使用者自行定義的巨集 CGI 設定檔
 services.cfg         //定義監控服務設定檔
 timeperiods.cfg      //定義監控期間設定檔



cgi.cfg 設定檔內容:
此次實作僅修改網頁路徑及開啟帳號認證其它設定都採預設值,至於指令可以執行或查看的帳號是要如何認證呢? 這些帳號及密碼就是到時要設定在 Apache .htpasswd 內的帳號及密碼,為何 Nagios 採用 Apache 帳號做認證? 因為 Nagios 的 CGI 是由 Apache 來執行的。
 main_config_file=/usr/local/etc/nagios/nagios.cfg    //定義主要核心設定檔
 physical_html_path=/usr/local/www/nagios             //定義網頁路徑 (預設值)
 physical_html_path=/home/web/nagios                  //修改後
 use_authentication=1                                 //開啟身份認證 (預設值)
 authorized_for_system_information=weithenn           //可查看系統資訊的帳號 (extinfo.cgi)
 authorized_for_configuration_information=weithenn    //可查看設定檔資訊的帳號
 authorized_for_system_commands=weithenn              //可執行系統指令的帳號 (cmd.cgi)
 authorized_for_all_services=weithenn                 //可查看所有服務的帳號
 authorized_for_all_hosts=weithenn                    //可查看所有主機的帳號
 authorized_for_all_service_commands=weithenn         //可執行服務指令的帳號 (cmd.cgi)
 authorized_for_all_host_commands=weithenn            //可執行主機指令的帳號

下列圖示為採用 Apache Basic Login 登入及登入 Nagios 後顯示認證帳號圖示



其它設定檔內容很難一一說明,其實只要參考 localhost.cfg 內容依個人網路環境進行修改即可,因為 localhost.cfg 內預設將 TIME PERIODS、CONTACTS、CONTACT GROUPS、HOSTS、HOST GROUPS、SERVICES 這些內容包含在內了,所以只要複製後出來按您的需求修改即可。不過修改設定檔時注意如下幾點:
  • Nagios Service 會先讀取 nagios.cfg 然後再去讀取裡面指定的設定檔。
  • 單行註解可以用 # 及 ; 來開頭 (但要注意的是註解符號之間不可有空格,否則執行 Nagios 會出現錯誤)。
  • 修改完設定檔後,要執行檢查/測試設定檔語法是否正確 (可使用 reload or restart 指令) 就會執行 -v 也就是會 check config。

若是覺得用文字模式來設定 Nagios 設定檔很難懂可以使用熱心人士寫出來的編輯 Nagios 設定檔的 GUI 工具。




步驟 3. 修改 rc.conf

修改完設定檔後請修改 /etc/rc.conf 以便系統重新開機時能自動啟動 Nagios 服務。
vi /etc/rc.conf
 nagios_enable="YES"

啟動 Nagios 服務 (日後若有再修改設定檔記得執行 reload)
/usr/local/etc/rc.d/nagios start     //啟動 Nagios 服務
 Performing sanity check of nagios configuration: OK
 Starting nagios.

檢查 Nagios 服務是否啟動成功
ps ax |grep nagios
 31217  ??  Ss     0:00.02 /usr/local/bin/nagios -d /usr/local/etc/nagios/nagios.cfg

查看 Nagios Log
tail /var/spool/nagios/nagios.log
 1178169537 Nagios 2.9 starting... (PID=31216)
 1178169537 LOG VERSION: 2.0
 1178169537 Finished daemonizing... (New PID=31217)






4、Me FAQ

Q1. 登入 Nagios 管理介面後隨便點選 item 出現錯誤訊息?

Error Message:
啟動 Nagios 服務後,登入 Nagios 管理介面當我隨便點選一個 item 都會出現如下圖錯誤訊息。


Ans:
請依如下步驟檢查:
  1. 確定您有設定主要環境設定檔,有可能你還沒設定主要環境 cgi 設定檔 (記得把範例檔複製來修改即可)。
  2. 確定您的 Web Service 能順利處理 .cgi (nagios cgi 不是 perl .cgi 是 binary file),若是使用 Web Service 為 Lighttpd 而無法順利使用可以參考站內文章 LigHttpd-輕量級 Web Server 裡面有說明 Lighttpd 配合 Nagios 的一些 FAQ。
  3. 確定 Web Service 有執行 CGI 的權限 (通常是把 Apache User 加入 Nagios Group 內),由於 Nagios 是以 Daemon 方式執行 Plugin 之後得到監控的結果,所以若我們想透過 Nagios 監控畫面來看監控結果時,代表 Apache 要有執行 CGI 的權限。



Q2. 無法使用管理介面的外部指令功能?

Error Message:
登入 Nagios 管理介面後,想使用送出外部指令的功能時出現如下圖錯誤訊息。



Ans:
圖示訊息很明顯告訴您 Nagios 目前沒有接收外部指令的功能因此送出的外部指令無法執行, 因為 Nagios 預設是不開啟接收外部指令的請修改 nagios.cfg 來開啟接收外部指令功能。
 #check_external_commands=0     //預設值
 check_external_commands=1      //修改後




Q3. 送出外部指令後出現錯誤訊息?

Error Message:
已確定 nagios.cfg 內有開啟接收外部指令的功能了,但使用管理介面送出外部指令後還是收到錯誤訊息。



Ans:
系統說找不到 nagios.cmd 執行檔;因為修改 nagios.cfg 後忘了 Restart Nagios Service 造成 nagios.cmd 執行檔沒有產生,所以也無法執行外部指令。
/usr/local/etc/rc.d/nagios restart      //重新啟動 nagios service
 Performing sanity check of nagios configuration: OK
 Stopping nagios.
 Performing sanity check of nagios configuration: OK
 Starting nagios.
cd /var/spool/nagios/rw ; ls
 nagios.cmd         //重新啟動才會生出此檔

執行外部指令成功後可在 /var/spool/nagios/nagios.log 內看到訊息,第一項為送出的外部指令 (DISABLE_HOST_CHECK),第二項為執行外部指令的內容,第三項為外部指令是否執行成功。
 [1178609419] EXTERNAL COMMAND: DISABLE_HOST_CHECK;See  
 [1178615357] Warning: Attempting to execute the command "/usr/bin/printf "%b" "***** Nagios 2.9 *****\n\nNotification Type:PROBLEM\nHost: See\nState: DOWN\nAddress: 172.18.1.34
 \nInfo: CRITICAL - Plugin timed out after 10 seconds\n\nDate/Time: Tue May 8 17:09:17 CST 2007\n" | /bin/mail -s "Host DOWN alert for See!" weithenn@weithenn.org"
 resulted in a return code of 127. Make sure the script or binary you are trying to execute actually exists...
 [1178616557] Auto-save of retention data completed successfully.

執行外部指令成功的圖如下。




Q4. 使用通知方式是 Mail 但未何都收不到 contact 通知?

Error Message:
使用通知方式是 Mail 但未何都收不到 contact 通知?


Ans:
查看了一下 command.cfg 通知 mail 的指令路徑是 /bin/mail 但本機的 mail 執行路徑是 /usr/bin/mail,更改 command.cfg 內容後在 reload nagios 即可順利收到 contact 通知了。
whereis mail
 mail: /usr/bin/mail /usr/share/man/man1/mail.1.gz /usr/src/usr.bin/mail