Nagios安裝部署與Cacti整合文件超精細版本
Nagios安裝部署與Cacti整合文件 |
||
系統環境:CentOS5.4 |
文件版本:V2.0.1 |
整理:Kevin |
更新時間:2011-05-31 |
備註:運維專用 |
Nagios是一款開源的免費網路監視工具,其功能強大,靈活性強。能有效監控Windows、Linux和Unix的主機狀態,交換機路由器等網路設定,印表機等。Nagios通常由一個主程式(Nagios)、一個外掛程式(Nagios-plugins)和四個可選的ADDON(NRPE、NSCA、 NSClient++和NDOUtils)組成。Nagios的監控工作都是通過外掛實現的,因此,Nagios
(1)NRPE:用來在監控的遠端Linux/Unix主機上執行指令碼外掛以實現對這些主機資源的監控
(2)NSCA:用來讓被監控的遠端Linux/Unix主機主動將監控資訊傳送給Nagios伺服器(這在冗餘監控模式中特別要用到)
(3)NSClient++:用來監控 Windows主機時安裝在Windows主機上的元件
(4)NDOUtils:則用來將Nagios的配置資訊和各event產生的資料存入資料庫,以實現這些資料的快速檢索和處理這四個ADDON(附件)中,NRPE和NSClient++工作於客戶端,NDOUtils
1. 文件更新記錄
時間 |
修改人 |
版本號 |
修改說明 |
2010.09.07 |
Kevin |
1.0.0 |
建立文件 |
2010.09.24 |
Kevin |
1.0.1 |
新增報警設定 |
2011.01.07 |
Kevin |
1.0.2 |
新增每日健康檢查報警機制 |
2011.02.16 |
Kevin |
1.0.3 |
更新文件生成pdf文件 |
2011.02.22 |
Kevin |
1.0.4 |
新增新的troubleshooting項 |
Kevin |
1.0.5 |
新增nagios |
|
2011.05.31 |
Kevin |
1.0.8 |
更新troubleshooting |
本文件規範網路監控系統安裝流程及安裝內容,供運維人員在部署新的運營環境時參考使用。
3. Nagios的安裝 3.1. 安裝基礎支援套件和新增使用者nagios需要一些基礎支援套件才能執行,如apache,gcc,glibc,gd庫等。
#yum install httpd #yum install gcc #yum install glibc glibc-common #yum install gd gd-devel #yum install php nagios3.2.0以後的版本必須安裝php,nagios頁面訪問才正常 #/usr/sbin/useradd -m nagios 新增一個名為nagios的使用者用以專門跑nagios #passwd nagios 設定密碼 #/usr/sbin/groupadd nagcmd 新增nagcmd使用者組,用以通過web頁面提交外部控制命令 #/usr/sbin/usermod -a -G nagcmd nagios 將nagios使用者加入nagcmd組 #/usr/sbin/usermod -a -G nagcmd apache 將apache使用者加入nagcmd組 |
#mkdir ~/downloads#cd ~/downloads#wget http://nchc.dl.sourceforge.net/sourceforge/nagios/nagios-3.2.1.tar.gz #wget http://nchc.dl.sourceforge.net/sourceforge/nagiosplug/nagios-plugins-1.4.15.tar.gz#cd
~/downloads#tar xzf nagios-3.2.1.tar.gz#cd nagios-3.2.1#./configure --with-command-group=nagcmd#make all#make install#make install-init #make install-config#make
install-commandmode 這時nagios基本已經安裝完成,預設安裝後的配置檔案用於啟動nagios是沒有問題的。#vi usr/local/nagios/etc/objects/contacts.cfg修改nagiosadmin這行其中的郵件地址為你的email地址,以將報警郵件發到你的郵箱#make install-webconf 安裝nagios的web介面#htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin 設定登陸web介面時HTTP驗證的賬號密碼#service httpd restart 啟動apache |
nagios-plugins是nagios官方提供的一套外掛程式,nagios監控主機的功能其實都是通過執行外掛程式來實現的。
#cd ~/downloads #tar xzf nagios-plugins-1.4.15.tar.gz #cd nagios-plugins-1.4.15 #./configure --with-nagios-user=nagios --with-nagios-group=nagios #make #make install |
nagios-snmp-plugins是一套用Perl編寫的通過SNMP方式監控主機的外掛程式。
#cd ~/downloads #wget http://nagios.manubulon.com/nagios-snmp-plugins.1.1.1.tgz #tar xzf nagios-snmp-plugins.1.1.1.tgz #cd nagios_plugins 配置check_snmp_int.pl這些外掛的使用時需要配置cpan,CPAN是Comprehensive Perl Archive Network的縮寫.。它是一個巨大的Perl軟體收藏庫,收集了大量有用的Perl模組(modules)及其相關的檔案。這裡主要是使用Perl-Net-SNMP模組。有兩種方式安裝: #perl -MCPAN -e shell cpan> install Net::SNMP
Crypt::DES Digest::MD5 Digest::SHA1 Digest::HMAC Net::SNMP 下載後對於每個模組依次按照下面的方式安裝 #tar zxf <module>.tar.gz <module>表示模組名,具體請按上面提到的模組替換 #cd <module> <module>表示模組名,具體請按上面提到的模組替換 #perl Makefile.pl #make test #make install 注意:Net::SNMP模組必須在最後安裝。至此Net::SNMP手動安裝完畢 #./install.sh |
至此nagios基本已經安裝完畢,但這時還不能馬上啟動nagios,需要以下設定。 #chkconfig --add nagios 將nagios新增到服務中 #chkconfig nagios on 設定服務為自啟動 #/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg #service nagios start 啟動nagios
#getenforce 檢視是否運行於強制模式,結果為1表示是 #setenforce 0 更改selinux運行於寬容模式 但是這個設定重啟後就會失效,如需要重啟後保持該設定需要修改/etc/sysconfig/selinux,將其中的SELINUX= enforcing更改為SELINUX= permissive並重啟系統。當然你也可以改成disable禁用selinux。 也可以不更改selinux的執行模式,解決辦法為: #chcon -R -t httpd_sys_content_t /usr/local/nagios/sbin/ #chcon -R -t httpd_sys_content_t /usr/local/nagios/share/ |
nagios目錄結構比較清晰,安裝後下面一共有bin etc libexec sbin share var幾個目錄,其中配置檔案都存放在etc目錄下,bin下存放的是nagios的相關命令,sbin下存放的是通過web方式外部執行的cgi,libexec存放的是所有外掛,而var則存放的是log和pid檔案等。而實現監控都是依靠執行外掛來實現的。
要實現監控,需要在nagios中定義一個service,在這個service中指定監控物件和監控命令以及報警機制等。Nagios的配置關係可以按照下圖來做說明:
nagios的配置也比較清晰明瞭,etc目錄下預設有objects目錄和一些配置檔案,其中objects裡放的是主配置檔案nagios.cfg包含進去的配置檔案。在nagios.cfg中既可以指定單獨包含一個cfg,也可以指定一個包含目錄,即該目錄下所有的cfg檔案都會包含進來。
首先我們配置下主配置檔案,為了目錄的清晰我們自己建立一些目錄來存放相關的配置檔案,比如建立commands目錄存放命令,建立services目錄存放服務,建立hosts目錄存放主機,在nagios.cfg檔案中找到cfg_file的部分,下面是一個示例,實際部署的時候可以按照你自己的情況去設定:
cfg_file=/usr/local/nagios/etc/objects/commands.cfg 包含配置檔案,下同 cfg_file=/usr/local/nagios/etc/objects/contacts.cfg cfg_file=/usr/local/nagios/etc/objects/timeperiods.cfg cfg_file=/usr/local/nagios/etc/objects/templates.cfg cfg_file=/usr/local/nagios/etc/objects/localhost.cfg cfg_file=/usr/local/nagios/etc/objects/switch.cfg cfg_dir=/usr/local/nagios/etc/services 包含配置目錄,目錄下所有cfg檔案將被包含;下同 cfg_dir=/usr/local/nagios/etc/hosts cfg_dir=/usr/local/nagios/etc/commands cfg_dir=/usr/local/nagios/etc/switches cfg_dir=/usr/local/nagios/etc/routers |
nagios.cfg其他地方可以暫不調整,該檔案中具體引數請參考附件中的配置檔案中文註釋
這裡先說明一下,監控都是依靠外掛去完成的,舉個例子說明,如我們要監控192.168.1.200這臺伺服器的虛擬記憶體,當達到70%的時候狀態為警告,達到90%的時候為嚴重。這個依靠check_snmp_storage.pl這個外掛來完成。
[[email protected] etc]# /usr/local/nagios/libexec/check_snmp_storage.pl -H 192.168.1.200 -C mypublic -2 -m "^Virtual Memory$" -w 70 -c 90 Virtual Memory: 21%used(531MB/2472MB) (<70%) : OK |
其中-H引數表示主機地址,-C引數表示SNMP團體名稱,-2表示使用SNMP v2協議,-w為warning(警告)狀態的閾值,-c表示為critical(嚴重)狀態的閾值
要用nagios實現監控某主機,就是要實現用nagios呼叫這樣的命令即可。
配置resource.cfg,檔案內容:
[[email protected] etc]# cat resource.cfg |grep -v '#'| sed /^$/d 檢視resource.cfg配置 $USER1$=/usr/local/nagios/libexec $USER7$=-C mypublic -2 |
這裡其實是定義兩個變數$USER1$和$USER7$,因為在後面定義command的時候外掛的路徑是絕對路徑,為了節省輸入直接可以用$USER1$代替/usr/local/nagios/libexec。而SNMP外掛的命令列中的引數需要設定SNMP相關的資訊,為節省輸入這裡用$USER7$來代替
-C mypublic -2。大家可對照上面檢測192.168.1.200的虛擬記憶體的例子結合來加以理解。
下面我們來定義一個command用以監控,仍然以在nagios中實現監控192.168.1.200這臺主機的虛擬記憶體為例說明。為了目錄結構的清晰,我們將command的定義都放到commands目錄下。在commands下建立一個cfg字尾的檔案,針對此示例的command定義內容為
define command{ command_name check_snmp_storage command_line $USER1$/check_snmp_storage.pl -H $HOSTADDRESS$ $USER7$ $ARG1$ -w $ARG2$ -c $ARG3$ } |
其中的$USER1$和$USER7$即為我們在上面的resource.cfg中定義的兩個變數,$HOSTADDRESS$為我們在下面要定義的主機。
在hosts目錄下建立一個cfg字尾的檔案來存放主機配置。
define host{ use windows-server 定義使用的模板 host_name web83 定義主機名為web83 alias web server on 111.83 主機別名 address 192.168.1.200 主機IP地址 hostgroups linuxtoneweb 將該主機歸到linuxtoneweb這個組,如果要歸到多個組裡,用逗號分隔組名 } |
在定義主機的時候我們將83歸到了linuxtoneweb這個組,下面來定義這個組名。可以直接在hosts下建立一個定義組名的cfg檔案。
define hostgroup{ hostgroup_name linuxtoneweb alias linuxtone web servers } |
這樣就定義了一個linuxtoneweb組,將主機歸為一個組有兩種方法,一種是我們這種在主機的定義中去設定,另外一種是在組的設定中定義members。如下:
define hostgroup{ hostgroup_name linuxtoneweb alias linuxtone web servers } |
在定義主機分組裡面我們還可以用hostgroup_members定義下級分組,十分方便。
OK,上面我們完成了命令、主機的定義,下面我們就要進入nagios監控某個物件的關鍵設定,nagios的監控都是靠定義一個service來實現,這裡我們定義一個service來實現監控83的虛擬記憶體。在services目錄下建立一個cfg檔案。
define service { hostgroup_name linuxtone,linuxtoneweb,database 定義監控物件 name memory 設定服務名 service_description check memory 服務描述 check_period 24x7 監控週期設定 max_check_attempts 4 最大檢測嘗試次數 normal_check_interval 3 正常檢測間隔時間 retry_check_interval 2 重試檢測間隔時間 contact_groups admins 報警聯絡組 notification_interval 10 通知間隔 notification_period 24x7 通知週期設定 notification_options w,u,c,r 定義什麼狀態時報警 check_command check_snmp_storage!-m "^Virtual Memory$"!70!90 } |
這樣我們完成對一個service的定義,定義監控物件我們這裡是定義了3個組,即屬於這3個組的所有主機都會檢測虛擬記憶體(注意:組必須在其他檔案中事先定義好)。當然你也可以用host_name針對主機作為檢測物件(多主機用逗號分隔)。監控週期和報警週期我們設定的都是24x7,這個會在後面去定義。定義報警狀態中的w表示warning,u表示unknown,c表示critial,r表示recovery(即恢復後是否傳送通知);報警選項一般生產環境下設定w,c,r即可。最後我們看到實現監控的主體部分
check_command check_snmp_storage!-m "^Virtual Memory$"!70!90
定義實現這個檢測的命令,check_snmp_storage即為我們上面在commands裡定義的命令名,
!表示帶入的引數,這裡有三個!表示帶入三個引數到command裡,每個引數之間用!分隔,這裡表示第一個引數為-m “^Virtual Memory$”,第二個引數為70,第三個引數為90。下面我們回頭去看看check_snmp_storage這個command的定義:
command_line $USER1$/check_snmp_storage.pl -H $HOSTADDRESS$ $USER7$ $ARG1$ -w $ARG2$ -c $ARG3$
這裡的$ARG1$即表示引數1,$ARG2即表示引數2,$ARG3$即表示引數3
而$HOSTADDRESS$是我們定義的檢測物件,它的值就是我們的主機IP地址;$USER1$和$USER7$為在resource.cfg裡的定義。下面我們將引數值代入這個command裡,最後實現的效果是:
/usr/local/nagios/libexec/check_snmp_storage.pl –H 192.168.1.200 –C mypublic -2 –m “^Virtual Memory$” –w 70 –c 90
而這個命令就是我們實現監控83的虛擬記憶體的命令!
設定3個引數是為了靈活的針對不同主機的呼叫,如果你對不同的主機設定的閾值不同,只需要對不同的主機定義不同的service即可,command是可以通用的!而這裡的引數1也是為了實現不同的功能而設定的,這個指令碼還可以檢測實體記憶體,如果我們把引數1的值設定為”^Phisical
Memory$”就可以針對實體記憶體進行檢測!定義command的時候引數的個數的設定是你可以根據需要設定的。只需要在後面service中能將引數值代到command中最終能實現你要檢測的命令即可。到此為止你可以感受到nagios的靈活性了吧。
到這裡我們基本實現了nagios的監控功能,下面我們繼續來看看其他設定。在定義host的時候我們有個主機模板的設定,這個設定的定義在object/template.cfg中定義的,這是一個系統自帶的配置檔案,關於我們所使用的Windows-Server的模板定義內容為:
# Windows host definition template - This is NOT a real host, just a template! define host{ name windows-server ; The name of this host template use generic-host ; Inherit default values from the generic-host template check_period 24x7 ; By default, Windows servers are monitored round the clock check_interval 5 ; Actively check the server every 5 minutes retry_interval 1 ; Schedule host check retries at 1 minute intervals max_check_attempts 10 ; Check each server 10 times (max) check_command check-host-alive ; Default command to check if servers are "alive" notification_period 24x7 ; Send notification out at any time - day or night notification_interval 30 ; Resend notifications every 30 minutes notification_options d,r ; Only send notifications for specific host states contact_groups admins ; Notifications get sent to the admins by default hostgroups windows-servers ; Host groups that Windows servers should be a member of register 0 ; DONT REGISTER THIS - ITS JUST A TEMPLATE } |
objects目錄下的contact.cfg中定義的是報警聯絡人。
define contact{ contact_name nagiosadmin ; Short name of user use generic-contact ; Inherit default values from generic-contact template (defined above) alias Nagios Admin ; Full name of user email [email protected] ; <<***** CHANGE THIS TO YOUR EMAIL ADDRESS ****** address1 [email protected] ;這裡是個自定義的變數設定,定義了一個SMS地址用以接收SMS報警資訊,聯絡人的自定義變數只能使用address1-address6;通過這個設定你可以實現多種報警方式,如電話,手機簡訊等,通過在這裡設定你的電話,手機號,然後到報警命令定義裡定義一個命令即可。 } |
其使用了generic-contact這個聯絡模板,關於這個模板templates.cfg裡的定義內容為:
define contact{ name generic-contact ; The name of this contact template service_notification_period 24x7 ; service notifications can be sent anytime host_notification_period 24x7 ; host notifications can be sent anytime service_notification_options w,u,c,r,f,s ; send notifications for all service states, flapping events, and scheduled downtime events host_notification_options d,u,r,f,s ; send notifications for all host states, flapping events, and scheduled downtime events service_notification_commands notify-service-by-email,notify-service-by-sms ; send service notifications via email host_notification_commands notify-host-by-email,notify-host-by-sms ; send host notifications via email register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL CONTACT, JUST A TEMPLATE! } |
上面我在該配置檔案中增加了notify-service-by-sms和notify-service-by-sms的兩種報警命令
而關於報警的週期設定在objects下的timeperiods.cfg中,如我們上面在service裡定義的7x24的報警週期設定內容為:
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 } |
通過這裡我們可以靈活設定報警時間以和報警方式結合,如週末和休息時間設定報警為傳送簡訊和郵件,工作時間設定為傳送郵件和SMS報警方式。
下面我們來看關於報警命令的設定,在objects下的command.cfg裡定義的為
define command{ command_name notify-host-by-email command_line /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | /bin/mail -s "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **" $CONTACTEMAIL$ } # 'notify-service-by-email' command definition define command{ command_name notify-service-by-email command_line /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$" | /bin/mail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$ } # 'notify-host-by-sms' command definition define command{ command_name notify-host-by-sms command_line php /usr/local/nagios/share/sms/smssendmsg.php $CONTACTADDRESS1$ "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" } # 'notify-service-by-sms' command definition define command{ command_name notify-service-by-sms command_line php /usr/local/nagios/share/sms/smssendmsg.php $CONTACTADDRESS1$ "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$" } |
定義了4種報警命令,後面兩種sms報警是我新增的;郵件報警是使用系統自帶的sendmail來發送郵件的(注意要啟動sendmail服務),而sms報警是使用我們上面所配置的sms機器人傳送的報警資訊。
至此,整個nagios的監控和報警機制瞭解完畢。注意我們在配置過程中的任何改動都記得要去通過/usr/local/nagios/bin/nagios –c /usr/local/nagios/etc/nagios.cfg以檢查配置檔案是否正確,如果正確則可以重啟nagios載入新配置(service
nagios restart)
Cacti的執行需要LAMP(Linux+Apache + MySQL + PHP), RRDTool , net-snmp , AMP環境我們在上面已經配置。
安裝rrdtool,rrdtool不能直接通過yum安裝,可以加入Dag RPM Repository以便讓yum能找到rrdtool #wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm #rpm -Uvh rpmforge-release-0.3.6-1.el5.rf.i386.rpm #yum install rrdtool
# yum -y install net-snmp net-snmp-utils net-snmp-libs php-mysql 安裝cacti Mysql>source /usr/local/cacti/cacti.sql 匯入mysql資料庫 Query OK, 0 rows affected (0.03 sec) 新增一個數據庫賬號cacti 密碼為cacti用以訪問cacti庫 Apache設定 Alias /cacti "/var/www/html/cacti" <Directory "/var/www/html/cacti "> Options FollowSymLinks MultiViews AllowOverride None Order allow,deny Allow from all </Directory> 修改cacti的配置檔案 #vi /usr/local/wwwroot/cacti/include/config.php /* load up old style plugins here */ $plugins = array(); $url_path = "/cacti/";
#wget http://mirror.cactiusers.org/downloads/plugins/cacti-plugin-0.8.7d-PA-v2.4.zip |
整合cacti和nagios是利用了cacti的一個外掛nagios for cacti,它的原理是將nagios的資料通過ndo2db匯入到mysql資料庫(cacti的庫中),然後cacti讀取資料庫資訊將nagios的結果展示出來。
6.1. 安裝ndoutils
首先需要安裝ndoutils以將nagios的資料能匯入到mysql資料庫中。 #wget http://nchc.dl.sourceforge.net/sourceforge/nagios/ndoutils-1.4b7.tar.gz #tar zxvf ndoutils-1.4b7.tar.gz # |