您的位置:首页 > 移动开发 > IOS开发

nagios监控配置详解

2016-12-14 23:08 330 查看
虽然目前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 one@163.com
} #这个只是定义一个联系人,nagios不能直接用,必须得再定义个联系人组。讲到这里得讲解一个宏定义,$CONTACTEMAIL$这个定义最终会变为email(one@163.com)。这个宏定义在发送邮件或者发送短信的命令中肯定是要做为参数传进去的。

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的自动发现,汇图功能等对于监控添加的方便性和数据收集功能实在是太好用了,这个问题倒也没那么在意。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息