雖然目前zabbix是比較流行的監控軟件,很多監控都從nagios切到了zabbix,但還是有些公司原先搭的是nagios環境,還一直在使用,因此,把自己nagios的使用經驗和對配置的一些理解記錄下,供還在使用nagios的人進行參考。
比較喜歡nagios的host group的界面,把相同業務的機器都弄到一個組,比如www有五臺,把五臺併到一個www組,這樣子監控界面看起來比較直觀,截圖如下:
以下來看下nagios的配置文件說明,nagios並不像zabbix一樣,zabbix的配置基本都在界面上,當然,nagios也有界面的配置,但nagios配置文件要理順比較不容易。
要理解nagios的配置文件,得從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
resource_file=/usr/local/nagios/etc/resource.cfg
1: /usr/local/nagios/etc/resource.cfg,此文件用來定義一些變量,這些變量在command命令配置中有使用到,在命令定義後面講解。例如:
$USER1$=/usr/local/nagios/libexec
2: /usr/local/nagios/etc/objects/commands.cfg,此文件用來定義命令。底下講解比較經典的nagios命令定義,nagios的命令定義都是用define command開頭的,在檢測主機和檢測服務的時候都有用到:
define command{
command_name check-host-alive
command_line $USER1$/check_ping -H $HOSTADDRESS$ -w 800.0,50% -c 1300.0,80% -p 9
}#定義爲檢測主機的命令定義,有使用$USER1$,這個會被替換爲/usr/local/nagios/libexec,其實$USER1$不用也可以,直接把命令寫全/usr/local/nagios/libexec/check_ping也行。然後$HOSTADDRESS$在定義主機和服務的時候,會被自動解析成定義的ip地址,後面會講解。
define command{
command_name notify-service-by-email
command_line $USER1$/email.sh "[$SERVICESTATE$]$HOSTALIAS$: $SERVICEDESC$ is $SERVICEOUTPUT$" "[nagios]<br>Notification Type: $NOTIFICATIONTYPE$<br><br>Service: $SERVICEDESC$<br>Host: $HOSTALIAS$<br>Address: $HOSTADDRESS$<br>State: $SERVICESTATE$<br><br>$SERVICEOUTPUT$<br>" "$CONTACTEMAIL$"
}#爲發送報警郵件的定義,可自行改裝成發送短信等等,有一些定義如$SERVICESTATE$,$HOSTALIAS$,$CONTACTEMAIL$都是nagios軟件裏面預先定義好的,後面會有講解。
define command{
command_name check_tcp
command_line $USER1$/check_tcp -H $HOSTADDRESS$ -p $ARG1$ $ARG2$
}#爲檢測主機tcp端口的狀態,這個一般用來定義service的,也就是服務檢測。nagios上都是先定義完主機,然後再定義各種服務的。$ARG1$ $ARG2$在定義檢測的時候可傳入參數,這個後續會有講解。
3: cfg_file=/usr/local/nagios/etc/objects/host.cfg,此文件可以用來定義主機監控,host.cfg是自己取的,可以自行定義。定義主機監控是使用define host進行定義的,一般你有幾臺服務器就定義幾個define host,一個機器多個ip的定義一個就好了。定義如下:
define host{
use linux-server
host_name test_0_1
address 192.168.0.1
}#上面在講解command的定義時候有說到些宏定義,其中$HOSTADDRESS$這個宏定義的就是這個定義中的address(192.168.0.1),$HOSTALIAS$就是host_name(test_0_1)。其中定義主機的時候還有使用到use這個關鍵字,這個是應用模板的。有應用到模板就講解一下另外一個模板的配置文件cfg_file=/usr/local/nagios/etc/objects/templates.cfg,模板的定義沒有關鍵字,如果要定義主機模板,是使用define host,定義服務模板等等的對應相應的關鍵字。linux-server模板定義如下:
define host{
name linux-server
use generic-host
check_period 24x7
check_interval 3
retry_interval 2
max_check_attempts 3
check_command check-host-alive
notification_period 24x7
notification_interval 0
notification_options d,u,r
contact_groups web
register 0
}#這個模板的有些定義我們寫不講解吧,最重要的那個check_command,在nagios中,主機檢測和服務檢測都必須要有check_command,這裏的command使用的是check-host-alive,這個check-host-alive在上面命令定義的時候有講解到,對應的command_line爲$USER1$/check_ping -H $HOSTADDRESS$ -w 800.0,50% -c 1300.0,80% -p 9,擴展出去就是/usr/local/nagios/libexec/check_ping -H 192.168.0.1 -w 800.0,50% -c 1300.0,80% -p 9,nagios就是使用這個命令進行檢測的。
4: cfg_file=/usr/local/nagios/etc/objects/hostgroup.cfg,上面講到主機的定義,這裏再講解一下nagios的主機組定義,nagios使用define hostgroup用來定義主機組。如下:
define hostgroup{
hostgroup_name testgroup
alias testgroup
members test_0_1,test_0_2
}#hostgroup_name就是一開始那張圖中顯示的名稱,members就是testgroup包含test_0_1和test_0_2,這個名字使用的是host中定義的host_name。多定義幾個組就能像一開始那張圖中展示的那樣了。
5: cfg_file=/usr/local/nagios/etc/objects/service.cfg,上面講到主機的定義,如果nagios單單是檢測主機的存活的話,那檢測就比較侷限了。例如我們還要檢測主機的端口監聽,磁盤剩餘等,這些在nagios中都稱爲服務檢測,定義的關鍵字爲define service。如下:
define service{
use generic-service
host_name test_0_1
service_description Check Port 80
check_command check_tcp!80
}#host_name就是指定檢測哪臺主機,服務的檢測是基於主機的,上面command中還有幾個宏定義沒有講,這裏可以再補充一個。$SERVICEDESC$就是service_description(Check Port 80)。另外,上面有說過檢測主機和服務都需要有check_command,這個使用check_tcp!80,check_tcp爲檢測命令,另外nagios使用!爲間隔來傳遞參數的值,所以80就是第一個參數的值。所以check_tcp的命令$USER1$/check_tcp -H $HOSTADDRESS$ -p $ARG1$ $ARG2$就被擴展爲/usr/local/nagios/libexec/check_tcp -H 192.168.0.1 -p 80,由於$ARG2$沒傳爲,就爲空了。
6: cfg_file=/usr/local/nagios/etc/objects/timeperiods.cfg,這個定義爲你可以定義在什麼時間去檢測主機或者服務。使用的關鍵字是define timeperiod,定義如下:
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
} #上面定義主機的時候,有講到模板,模板中有使用check_period 24x7,這個使用的是這個的定義nagios中經典的定義就是24x7和workhours吧。
7: cfg_file=/usr/local/nagios/etc/objects/contacts.cfg這個聯繫人定義是發送郵件短信時發送給誰的定義,一般都需要先定義一個聯繫人(使用define contact關鍵字),然後再定義一個聯繫人組(define contactgroup),因爲nagios使用的都是聯繫人組。看下聯繫人的定義:
define contact{
contact_name one
use generic-contact
alias one
email [email protected]
} #這個只是定義一個聯繫人,nagios不能直接用,必須得再定義個聯繫人組。講到這裏得講解一個宏定義,$CONTACTEMAIL$這個定義最終會變爲email([email protected])。這個宏定義在發送郵件或者發送短信的命令中肯定是要做爲參數傳進去的。
define contactgroup{
contactgroup_name admins
alias admin
members one
}#這裏定義的聯繫人組才能被nagios使用,也就是在定義主機或者定義服務的使用要使用聯繫人組才行,定義主機的時候可以再加入contact_groups admins這個用來指定聯繫人組使用的是哪個。另外,還需要講解下contact中用到的generic-contact這個模板,這個模板是在contact中定義的,所以模板也肯定是使用contact了,定義如下:
define contact{
name generic-contact
service_notification_period 24x7
host_notification_period 24x7
service_notification_options c,f,s,r,u
host_notification_options d,r,f,s
service_notification_commands notify-service-by-email
host_notification_commands notify-host-by-email
register 0
}#爲什麼要講解這個模板,因爲有使用到兩個比較重要的關鍵字,分別是service_notification_commands和host_notification_commands,這兩個關鍵字是指定當主機或者服務的狀態發生變化後,觸發哪個command的執行,這裏執行的命令也必要在命令中有定義過。另外這裏再說明下幾個宏定義:
1: $SERVICESTATE$,這個值爲OK或者WARNING或者CRITICAL或者UNKNOWN,nagios命令定義中除了發送郵件的命令無需理會返回狀態外,其它的command的定義必要要明確寫明返回值。當你exit 0爲ok,exit 1爲warnging,exit 2爲critical,exit 3爲unknown。nagios檢測主要是狀態發生變化,如果第一次爲exit 0,第二次exit critical,那就是從ok轉向critical的狀態改變,這裏是告警的關鍵。
2: $SERVICEOUTPUT$,這個不得不講解一個,在exit狀態之前,你需要只輸出一行的文字,這一行的文字就存儲在$SERVICEOUTPUT$這個變量中,在exit狀態之前,只能輸出一行文字,這個才準 。這個變量應該只存儲一行的文字。
3: $NOTIFICATIONTYPE$,這個爲PROBLEM或者RECOVERY吧,當這個爲PROBLEM時表示告警了,當爲RECOVERY的時候表示告警恢復了。
差不多就講解這些吧,nagios整套配置理解起來還是有點難度的,不過理解後添加監控也是較爲不方便,比起zabbix來說。但nagios簡單,它只關注業務正不正常,不保留任何的數據,還有一個比較好的就是在exit之前可以自定義echo,網絡問題或者運行超時等等檢測對nagios來說影響不大。
不得不想起zabbix會讓你選擇數據類型(比如返回int),但如果在比較特殊的情況下,例如網絡有問題,zabbix檢測到返回的是string就會變成不支持的狀態了,因爲這個問題,我遷到zabbix後就有個問題因爲這個給忽略了,最後造成用戶受到影響。而大部分zabbix我選擇的都是int類型。zabbix就算選擇的是返回string類型,但在運行超時或者網絡異常時也是會變成不支持。zabbix檢測變成不支持這個我是特別不喜歡,不過zabbix的自動發現,匯圖功能等對於監控添加的方便性和數據收集功能實在是太好用了,這個問題倒也沒那麼在意。
最後附上本人的網絡課堂地址,如有興趣請點擊: 實踐哥