俗話說:工欲善其事,必先利其器.要做好系統管理,使自己的工作更輕鬆更有效的話,一個好的監控工具是必不可少的了.在這裏我向大家推薦一款我使用了4年多的、功能強大、可靈活定製的開源監控利器---nagios。
首先,我們來看實際工作中需要監控的對象有哪些?在這裏我總結出2種類型的監控對象:網絡服務監控及主機資源監控。網絡服務監控可包括主機存活檢查、web服務監控、ftp服務監控、數據庫服務監控、自定義服務監控等;主機資源監控可包括系統負載、當前ip鏈接數、磁盤空間使用情況、當前進程數以及自定義的資源監控等。
其次,我們再來看nagios監控的表現形式。監控的主要目的是當監控的對象發生故障或資源緊張時及時通知相關人員,以便問題得到迅速的處理。追求的效果就是“在老闆和客戶發現問題之前得到及時、有效的通知”,假定故障通知來自老闆,我想大家都不會很愉快的。Nagios爲了方便我們的管理工作,提供了至少3種表現手段:
1、web方式,即通過瀏覽器觀看被監控的對象;如正常狀態下,其狀態(status)是以藍色填充並顯示一個OK。
2、郵件通知,發生故障時,到達設定重試次數和探測間隔時間後發送郵件給管理員或相關人員,報告問題的大致情況。
3、手機短信,這是非常有用和及時的功能了;晚上熟睡中,再也沒可能看web頁面或查閱郵件,可以一旦發生故障,手機短信卻能把你隨時喚醒。
一般情況下,這3者是同時進行的:上班時間開個瀏覽器看頁面顯示、打開郵件程序定時收取郵件、手機24小時在線。
1、web方式,即通過瀏覽器觀看被監控的對象;如正常狀態下,其狀態(status)是以藍色填充並顯示一個OK。
2、郵件通知,發生故障時,到達設定重試次數和探測間隔時間後發送郵件給管理員或相關人員,報告問題的大致情況。
3、手機短信,這是非常有用和及時的功能了;晚上熟睡中,再也沒可能看web頁面或查閱郵件,可以一旦發生故障,手機短信卻能把你隨時喚醒。
一般情況下,這3者是同時進行的:上班時間開個瀏覽器看頁面顯示、打開郵件程序定時收取郵件、手機24小時在線。
最後,我們以一個實際場景來展示nagios的強大功能,希望對大家的系統管理工作有所幫助。
場景描述
爲了描述問題方便,我們假定有5個服務器要監控(web服務器、數據庫服務器、郵件服務器、nfs文件共享服務器),需要對幾個服務器的服務進行監控,同時監控每個服務器的資源使用情況,包括負載情況、磁盤分區使用情況、總進程數、當前ip連接數這個4個項目(當然你也可以自己寫腳本監控更多的資源對象)。這些服務器除了系統管理員而外,還有其他用戶(如程序員)對各自的服務器進行維護;當發生故障的時候,維護網站的程序員能收到報警郵件和報警短信,而管理數據庫管理員則無需收到這些報警,同時維護程序的用戶可以以自己的帳號登陸監控服務器,通過web方式察看自己所管服務器的狀態(只能看自己的而看不到別人管轄服務器的狀態)。
爲了描述問題方便,我們假定有5個服務器要監控(web服務器、數據庫服務器、郵件服務器、nfs文件共享服務器),需要對幾個服務器的服務進行監控,同時監控每個服務器的資源使用情況,包括負載情況、磁盤分區使用情況、總進程數、當前ip連接數這個4個項目(當然你也可以自己寫腳本監控更多的資源對象)。這些服務器除了系統管理員而外,還有其他用戶(如程序員)對各自的服務器進行維護;當發生故障的時候,維護網站的程序員能收到報警郵件和報警短信,而管理數據庫管理員則無需收到這些報警,同時維護程序的用戶可以以自己的帳號登陸監控服務器,通過web方式察看自己所管服務器的狀態(只能看自己的而看不到別人管轄服務器的狀態)。
通過上面的描述,我們可以整理出下面的表格:
配置好nagios和被監控機器後,其在瀏覽器裏的基本輸出與下圖類似:
Nagios服務器的自我監控實現
要實現資源和服務兩個方面的監控,需要配置服務器端(nagios server)及被監控端(NRPE-nagios remote plugin executor).爲了能順利地、有條理的部署nagios監控平臺,一個好的工作風格是在nagios server自身實現服務和資源的監控,然後再在其他監控端部署nrpe,從nagios server端用check_nrpe測試通過後,再在nagios server配置文件中逐一增加監控項目。當然如果只是監控服務而不監控主機資源,則被監控端不做任何nrpe的安裝。爲了方便初學者更容易上手和成功,我們就從簡單的步驟開始。
要實現資源和服務兩個方面的監控,需要配置服務器端(nagios server)及被監控端(NRPE-nagios remote plugin executor).爲了能順利地、有條理的部署nagios監控平臺,一個好的工作風格是在nagios server自身實現服務和資源的監控,然後再在其他監控端部署nrpe,從nagios server端用check_nrpe測試通過後,再在nagios server配置文件中逐一增加監控項目。當然如果只是監控服務而不監控主機資源,則被監控端不做任何nrpe的安裝。爲了方便初學者更容易上手和成功,我們就從簡單的步驟開始。
一、 配置郵件發送功能
因爲報警郵件發送給用戶郵箱後,監控系統本身沒有必要接受別的郵件服務器發送的郵件,因此只需要使用服務器本身自帶的sendmail來發送報警信息即可。用sendmail的另外一個目的就是簡便。
因爲報警郵件發送給用戶郵箱後,監控系統本身沒有必要接受別的郵件服務器發送的郵件,因此只需要使用服務器本身自帶的sendmail來發送報警信息即可。用sendmail的另外一個目的就是簡便。
如果系統是redhat 或 centos ,只需執行 service sendmail start 啓動守護進程,然後再用dns服務器給它一個合法的域名(即A記錄),馬上就可以用mail命令來發送測試郵件到你的某個電子郵箱裏了。收到測試郵件,就說明郵件系統配置結束,是不是很容易呢?這裏給一個發送郵件的例子:
mail -s “This is sery’s nagios test mail” [email protected] < install.log
二、測試短信發送
正常情況下,沒有任何服務器能向手機發送短消息的,要到達這個目的,得花錢購買短信服務(也有些人運用飛信一類的方式來達到這個目的,個人覺得對於運營網站不是太靠譜)。要是在幾年前,自己申請短信通道還是有可能的,2005年以後似乎門檻提高了很多。當你付費成功後,短信服務商會給你提供入口及加密關鍵字;然後我們自己寫個腳本就可以發送短信。以下是我的服務器用perl寫的腳本:
#!/usr/bin/perl -w
use strict;
use LWP::Simple;
use URI::Escape;
use Digest::MD5;
my ($mobile, $content) = @ARGV;
my $log_control = 1;
my $key = 'Ysdbyhd6T';
my $souce_content = substr($mobile, 0, 8) . substr($mobile, -10, 10) . $key;
my $md5 = Digest::MD5->new;
$md5->add($souce_content);
my $result_conent = uc($md5->hexdigest);
my $url = "http://http.asp.sh.cn/MT.do?Username=sery&Password=([-BVG'0&Mobile =$mobile&Content=$content&Keyword=$result_conent";
my $result = get $url;
if($log_control) {
my $fh;
open($fh, '>> /var/log/sms.log') or die "can't open log: $!";
print $fh join(' ', time, $result, "\n");
close $fh;
}
(以上腳本由宇捷提供)
說明:
1、my $key = 'Ysdbyhd6T'’ 短信服務商給的驗證關鍵字。
2、my $url=”…..” 短信服務商給的用戶名、密碼以及短信服務商的訪問接口(url)全包括在這裏了。
我們把這個文件放在目錄 /usr/local/bin/ 下面,把它命名爲 sms_send.pl ,用命令 chomod +x /usr/local/bin/sms.pl 給與它執行權限。這個腳本在各種各樣的unix、linux下都可以正常工作,nagios報警短信發送就是靠它了。如果讀者也打算拿這個腳本發送短信的話,只要改一下key值和url值就可以直接使用。
接下來就是驗證是否可以發送短信,執行命令行 /usr/local/bin/sms.pl 13300108888 "It is a test" ,回車後數秒鐘,你的手機應該能收到帶有內容“It is a test”的短信息。爲了保證短信服務的可靠性,我做了一個策略:每天下午6點定時給我發一個通知短信;告訴我短信發送是正常的,也是該下班回家了。做法:執行 crontab –e 然後輸入行 00 18 * * * /usr/local/bin/sms.pl 13300108888 "It is Ok” 。
三、部署apache
Apache應該是我們最常用的部署了,它可以被弄得很複雜,但在nagios 這個平臺上,我們只需要簡單的功能即可,爲了驗證用戶,我們稍微加一點修改就行了。這樣做也是爲了體現“越簡單越容易的思想”。做得簡單,以後重新部署或恢復就越迅速、越沒壓力[1]。
(一)安裝apache
tar zxvf httpd-2.2.8 .tar.gz
cd httpd-2.2.8
./configure --prefix=/usr/local/apache #僅僅需要這麼一個選項
make
make install
(二)檢查apache是否被正確的安裝
1、執行 /usr/local/apache/bin/apachectl –t 檢查apache的配置文件語法是否正確。未經更改的apache配置文件語法顯然是正確無誤的,當我們對配置文件httpd.conf 或其包含的文件作了更改的時候,最好先運行一下這個命令,它的錯誤輸出能迅速定位配置文件哪裏出現了錯誤。
2、執行命令行 /usr/local/apache/bin/apachectl start 啓動apache守護進程,在別的機器的瀏覽器裏輸入這個服務器的ip地址,看是否可以正常瀏覽apache的默認頁面—通常是一個“IT works!”。爲了方便以後維護apache 更方便些,我們可以修改環境變量文件/etc/profile,在文件的末尾追加行 “export PATH=$PATH:/usr/local/apache/bin “,保存後執行 source /etc/profile 使其修改立即生效,這樣我們以後執行apache 啓動之類的命令就不必輸很長一串路徑,直接輸入 apachectl start 就可以了。
(三)修改apache配置文件httpd.conf
1、修改apache運行用戶和組。默認是daemon,需要把它改成nagios。這樣它纔能有權限訪問我們安裝的nagios目錄,執行相關的cgi命令,如通過瀏覽器界面關閉nagios、停止某個故障對象發送報警信息等。
2、添加nagios訪問目錄(nagios 的安裝路徑/usr/local/nagios),同時使用http用戶驗證。把下面的內容追加到httpd.conf文件的末尾:
.Alias /nagios/cgi-bin /usr/local/nagios/sbin
<Directory "/usr/local/nagios/sbin">
AuthType Basic
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
AuthName "Nagios Access"
AuthUserFile /usr/local/nagios/etc/htpasswd
Require valid-user
</Directory>
Alias /nagios /usr/local/nagios/share
<Directory "/usr/local/nagios/share">
AuthType Basic
Options None
AllowOverride None
Order allow,deny
Allow from all
AuthName "nagios Access"
AuthUserFile /usr/local/nagios/etc/htpasswd
Require valid-user
</Directory>
照這樣一種方式修改配置文件,保證不會把配置文件改得一塌糊塗,我相信大部分初學者都有把文件修改後而不知道文件本身的原貌。到這步配置文件雖然修改好了,但還不能通過語法檢查,因爲有2個與之相關聯的東西還不存在,他們是用戶和組nagios及apache的驗證用戶文件/usr/local/nagios/etc/htpasswd . 在後續操作中完成這任務後,再驗證不遲。
四、部署nagios服務
(一) 添加帳戶,以用來運行Nagios。當然也可以用root運行,但出於安全考慮而使用普通帳號來運行,並且不給這個賬號分配shell登錄權限.
1、 linux增加帳號的操作爲 useradd nagios –s /sbin/nologin 添加帳號就自動生成同名組 nagios。
2、 freebsd增加帳號的操作爲 pw groupadd nagios ; pw useradd nagios –g nagios –s /sbin/nologin.
注意:不要給nagios用戶設置密碼。
(二)安裝nagios軟件
tar zxvf nagios-2.9.tar.gz
cd nagios-2.9
./configure –prefix=/usr/local/nagios ----with-nagios-user=nagios --with-nagios-group=nagios
make all
make install 執行完這個步驟後,程序會提示依次運行 make install-init , make install-commandmode ,make install-config 這幾個命令。我們選取其中的兩個來執行:
make install-commandmode
make install-config
跟一般的gnu源碼軟件安裝相比,nagios的安裝多了幾個步驟(一般的軟件運行到make install就算安裝完了)。當然也可以連這兩步都不執行,用手工賦予目錄或文件權限,再手動創建配置文件,其效果完全相同。安裝完nagios後,我們可以在安裝目錄/usr/local/nagios下生成下面的目錄:
(三)安裝nagios插件
沒有插件,nagios將什麼作用也沒有,插件也是nagios擴展功能的強大武器,除了下載常用的插件外,我們還可以根據實際要求編寫自己的插件。Nagios的插件nagios-plugins-1.4.9 在www.nagios.org上可以找到,接着我們用wget下載它。注意:插件與nagios之間的版本關聯不大,不一定非得用nagios-plugins-1.4.9這個版本。下載完成後,安裝它是很簡單的:先執行配置 ./configure –prefix=/usr/local/nagios ,接着編譯安裝 make ; make install即可。這裏需要說明一下的是在配置過程指定的安裝路徑是/usr/local/nagios,而不是/usr/local/nagios-plus,安裝完成後,將在目錄/usr/local/nagios生成目錄libexec(裏面有很多文件),這正是nagios所需要的。(四)配置nagios
配置是nagios最複雜的部分,讓我們耐心一些,逐個處理,配置成功也不是什麼難事。剛安裝完成的nagios,其配置文件的目錄是/usr/local/nagios/etc,下圖是其etc目錄的文件:
先把這些文件改名,如 cgi.cfg-sample改成cgi.cfg ,用命令cp cgi.cfg-sample cgi.cfg …依樣把餘下的幾個*.cfg-sample都複製成*.cfg文件。從nagios2.6版開始,不用修改配置文件localhost.cfg就可以直接運行../bin/nagios –v nagios.cfg驗證程序是否能正常運行(nagios2.5及以前版本的最小運行的配置文件是minimal.cfg,但需要修改這個文件多處才能驗證成功)。當然,我們不能指望這個最小的配置文件能夠滿足實際的需求,因此,需要對現有的配置文件進行修改,其次增加自定義的一些配置文件。通過複製這些自帶的模板文件,我們可以得出幾個主要的配置文件,我們可以把它歸類爲:
依照這個表格,我們逐一配置之。
1、修改主配置文件nagios.cfg.基於方便維護的原則,把各個配置目標單獨放在文件中,如聯繫人信息在contacts.cfg中定義。Nagios.cfg文件比較長,我只把修改過的內容貼出來:
#註釋或刪掉這行
#cfg_file=/usr/local/nagios/etc/localhost.cfg
#主機配置文件路徑
cfg_file=/usr/local/nagios/etc/hosts.cfg
#//主機組配置文件路徑
cfg_file=/usr/local/nagios/etc/hostgroups.cfg
#聯繫人配置文件路徑
cfg_file=/usr/local/nagios/etc/contacts.cfg
#聯繫組配置文件路徑
cfg_file=/usr/local/nagios/etc/contactgroups.cfg
#服務配置文件路徑
cfg_file=/usr/local/nagios/etc/services.cfg
#監視時段配置文件路徑
cfg_file=/usr/local/nagios/etc/timeperiods.cfg
#在web界面下重啓nagios、停止主機/服務檢查等操作,.默認值是0.
check_external_commands=1
#根據自己的情況定這個命令檢查時間間隔.默認值是1秒.
command_check_interval=10s
2、修改cgi配置文件cgi.cfg.跟修改nagios.cfg一樣,只貼出被修改之處:
#如有多個用戶,中間用逗號隔開
authorized_for_system_information=sery
authorized_for_configuration_information=sery
authorized_for_system_commands=sery
authorized_for_all_services=sery
authorized_for_all_hosts=nagiosadmin,sery
authorized_for_all_service_commands=sery
authorized_for_all_host_commands=sery
在這裏指定的用戶”sery”可以通過瀏覽器操縱nagios服務的關閉、重啓等各種操作。
3、修改commands.cfg配置文件
這個文件已經包含了發送郵件報警的部分,因此只需要再把短信報警的部分加上就可以了
###### host-notify-by-sms command definition
define command{
command_name host-notify-by-sms
command_line /usr/local/bin/sms.pl $CONTACTPAGER$ "$NOTIFICATIONTYPE$ alert - Host $HOSTNAME$ is $HOSTSTATE$"
}
###### service-notify-by-sms command definition
define command{
command_name service-notify-by-sms
command_line /usr/local/bin/sms.pl $CONTACTPAGER$ "$NOTIFICATIONTYPE$: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$"
}
第一個塊定義主機報警的內容,即主機發生死機、恢復等情況發送手機短信報警,其接受者和發送內容由“$..$”定義的宏來決定。第二個塊定義服務報警內容,即監控的服務或監控的主機資源發生故障時發送手機報警短信。Nagios規定,如果探測到被監控的主機停機或不可達,它就不再探測這個停機主機上的服務。通俗地一點理解:主機都停了,當然服務也跟着停了!另外一個需要注意的地方是命令行(command_line)路徑一定要用全路徑,這裏調用的命令就是我們在全面編寫的那個腳本sms.pl。
4、 新增其他配置文件
在主配置文件nagios.cfg中,我們註釋了行 cfg_file=/usr/local/nagios/etc/localhost.cfg ,而使用若干單獨的配置文件來定義各種對象,這樣可以獲得維護方便、書寫規範等諸多方面的好處。這些單獨的配置文件不是自然存在的,我們需要手工創建並添加內容。當然,一開始我們並不是很清楚怎麼往這些文件裏添加內容,只好回過頭去看官方文檔,天啦,太分散了,盡然不知道怎麼着手了!怎麼辦?打開文件localhost.cfg-sample,心裏基本上就有數了:無非是把這個文件拆分開來,形成多個文件嘛!下面我按新添一個主機進入監控的較優方式添加這些配置文件(當然也可以有其它的順序,這並不影響監控的效果)。好了,我們先把nagios服務器本身給監控上,這些監控包括:主機存活、web服務監控、磁盤空間監控、負載監控、進程數監控、ip連接數監控。
在主配置文件nagios.cfg中,我們註釋了行 cfg_file=/usr/local/nagios/etc/localhost.cfg ,而使用若干單獨的配置文件來定義各種對象,這樣可以獲得維護方便、書寫規範等諸多方面的好處。這些單獨的配置文件不是自然存在的,我們需要手工創建並添加內容。當然,一開始我們並不是很清楚怎麼往這些文件裏添加內容,只好回過頭去看官方文檔,天啦,太分散了,盡然不知道怎麼着手了!怎麼辦?打開文件localhost.cfg-sample,心裏基本上就有數了:無非是把這個文件拆分開來,形成多個文件嘛!下面我按新添一個主機進入監控的較優方式添加這些配置文件(當然也可以有其它的順序,這並不影響監控的效果)。好了,我們先把nagios服務器本身給監控上,這些監控包括:主機存活、web服務監控、磁盤空間監控、負載監控、進程數監控、ip連接數監控。
(1)、定義主機配置文件hosts.cfg
define host {
host_name nagios-server
alias nagios server
address 59.26.240.63
contact_groups sagroup
check_command check-host-alive
max_check_attempts 5
notification_interval 10
notification_period 24x7
notification_options d,u,r
}
說明:
● 聯繫組contact_group沒有建立,需在後面的步驟完成。
● 主機檢查命令行一般選擇檢查主機存活check-host-alive。
● 最大嘗試次數最好不要設置爲“1”,一般3-4次比較合理。
● 通知時間間隔notification_interval 根據自己實際情況設定,它的單位是分鐘。
● 通知選項notification_options 幾個值的意思是 d-down,u-unreacheable,r-recovery.
(2)、定義主機組配置文件hostgroups.cfg
define hostgroup {
hostgroup_name sa-servers
alias sa servers
members nagios-server
}
說明:
● 這個配置文件不是必須的,爲了在瀏覽器裏方便歸類及察看狀態,可以添加這個文件。
● 主機組的成員必須是在hosts.cfg裏已經定義了的,多個主機成員間用逗號分隔。
(3)、定義聯繫人配置文件contacts.cfg
define contact {
contact_name sery
alias system administrator
service_notification_period 24x7
host_notification_period 24x7
service_notification_options w,u,c,r
host_notification_options d,u,r
service_notification_commands service-notify-by-email,service-notify-by-sms
host_notification_commands host-notify-by-email,host-notify-by-sms
email [email protected]
pager 13301000018
}
說明:
● 服務通知選項 w-warning,u-unknown,c-critical,r-recovery.
● 主機通知選項 d-down,u-unreacheable,r-recovery。
● 服務通知命令行及服務通知命令行在配置文件commands.cfg中得到定義,如果有報警發生,則郵件和手機短信一起發送給相關人,即下兩行定義的email,pager.
● 收報警信息的郵件和手機,一個人如有2個手機,手機號之間有逗號分隔,郵件也如此。
● 如果這裏定義的用戶需要通過瀏覽器察看他所負責的服務器監控狀態的話,還需要 用apache的工具htpasswd增加同名帳號。
(4)、定義聯繫組配置文件contactgroups.cfg
define contactgroup {
contactgroup_name sagroup
alias system administrator group
members sery
}
說明:
● 當有多個人行使同樣的職責時,定義成組是非常有用的。
● 多個成員之間用逗號分隔。
● 成員必須在聯繫人配置文件(contacts.cfg)已經定義。