现在的位置: 首页 > 运维管理 > 监控 > 正文
Nagios监控的调优与使用技巧
2013年11月10日 监控 ⁄ 共 6817字 Nagios监控的调优与使用技巧已关闭评论 ⁄ 被围观 8,522 views+

一、调优:

1.1 调整监控的灵敏度:

在Nagios的配置文件中,有个interval_length参数,定义了以后其他地方需要用到的间隔时间单位长度,该值默认为60s:

# INTERVAL LENGTH
# This is the seconds per unit interval as used in the
# host/contact/service configuration files.  Setting this to 60 means
# that each interval is one minute long (60 seconds).  Other settings
# have not been tested much, so your mileage is likely to vary...

interval_length=60

在定义主机和服务时,都是以该值为基础的,如服务中定义如下:

check_interval                 6
retry_interval                  2

则表示检查间隔为6*60s,即每6分钟才检查一次,而重试时间为2分钟。对于一些敏感度要求高的服务,这明显不能满足我们的要求,因此可以将其调小,如调整为10秒:

interval_length=10

这样就提高了检查的灵敏度,但有些服务又不需要如此高的灵敏度,如磁盘空间(不会一下就增加很多),则可以在定义check_interval是增大其数值。

还可以调整如下时间,定义主机和服务检测超时时长的,如下为默认值,单位为s:

service_check_timeout=120
host_check_timeout=60
event_handler_timeout=60
notification_timeout=60
ocsp_timeout=10
perfdata_timeout=10

注意:灵敏度和误报率是成正比的,检查间隔越小,月可能出现误报。需根据实际情况调整到合适的值。

1.2 服务和主机依赖:

定义服务依赖,有助于降低务必要的报警,如某服务器连接的交换机坏了,则服务器及其服务肯定无法再检测,此时就完全不再去检测服务器和其服务。

服务依赖定义语法:

标记了(*)的域是必备的而蓝色是可选的。然而你最少要在定义中给定出一种使用类型标准。

define servicedependency{
            dependent_host_name       host_name(*)
            dependent_hostgroup_name       hostgroup_name
            dependent_service_description       service_description(*)
            host_name       host_name(*)
            hostgroup_name       hostgroup_name
            service_description       service_description(*)
            inherits_parent       [0/1]
            execution_failure_criteria       [o,w,u,c,p,n]
            notification_failure_criteria       [o,w,u,c,p,n]
            dependency_period       timeperiod_name
            ...
            }

主机间依赖定义:

image

在上图例子中,针对主机C的依赖关系定义将会是这样的:

define hostdependency{
    host_name            Host A
    dependent_host_name        Host C
    notification_failure_criteria    d
}
define hostdependency{
    host_name            Host B
    dependent_host_name        Host C
    notification_failure_criteria    d,u
}

二、使用pnpnagios实现对性能数据绘图:

只要检测返回数据包含性能数据(即返回结果以管道符|分开的,且有特定格式的部分),就可以使用rrdtool实现绘图,而rrdtool实现较为复杂,因此一般需要借组与第三方工具去操作rrdtool,如pnp4nagios、cacti实现绘图。还有一种方式是使用mrtg实现绘图,但mrtg功能较简单,且绘图开销较大。

Nagios默认提供了Nagiosgraph绘图功能,也提供了mrtg示例文件,要绘制各种Nagios的性能统计图的MRTG配置文件片段可查看Nagios发行包里sample-config/子目录下的mrtg.cfg文件。如果需要可以创建性能信息的其他图表文件 - 样例只是提供了一个好的起点。一旦你复制这些样例文件到你的MRTG配置文件(/etc/mrtg/mrtg.cfg)里,你将在MRTG的下次运行时得到这些新图表。mrtg和graph绘图功能官方说明文档中都有详细说明。

而我实际使用中,使用了pnp4nagios实现,实现办法网上有很多教程,这里不再详述,绘图效果如下:

image

三、Nagios的权限和通知功能加强:

在我所监控的环境中,监控服务器超过200台,网络设备几十台,服务上千,这些服务器和网络设备是有几个人进行管理的。而监控的服务就有更多的人关心,如开发测试部门,他们需要知道自己负责的系统的服务状态。因此要求Nagios的通知功能和查看权限要进行细化配置,而这又正是Nagios的比较弱的地方,我采用了如下的方式实现:

3.1 使用LDAP认证:

我实际的环境中,需要Nagios权限的人有近20个,如果使用传统的密码文件方式认证,很不利于管理(比如用户不能自己修改密码,用户要记多个系统不同的密码),而我们所有系统的认证都是通过Windows Active Directory进行认证的,因此使用LDAP认证可以实现统一认证。在apache httpd中,提供了一个mod_authnz_ldap模块,可以实现基于ldap的认证,mod_authnz_ldap认证分两个阶段完成,第一阶段会去ldap查找用户是否存在,第二阶段:如果查找到该用户,则验证该用户是否具有相应权限。关于该模块的详细说明可参考官方文档,详细实现过程如下:

3.1.1 在域控制器上特定OU下建立具有Nagios权限的用户组:

在AD域上,创建一个组,将需要访问Nagios的用户都加入到该组即可。我这里所有用于管理的都建立的admin这个OU下,组名为nagiosusers。

3.1.2 配置Nagios通过LDAP认证:

编辑Nagios的httpd配置文件,将所有使用密码文件验证的地方替换为ldap验证,具体如下:

vi /etc/httpd/conf.d/nagios.conf

<Directory "/usr/local/nagios/share">
#  SSLRequireSSL
   Options None
   AllowOverride None
   Order allow,deny
   Allow from all

#  如下红色几行为原默认认证方式
#   AuthName "Nagios Access"
#   AuthType Basic
#   AuthUserFile /etc/nagios/htpasswd.users
#   Require valid-user

#   如下部分为LDAP认证方式
    AuthName "Nagios Access"
    AuthType Basic
    AuthBasicProvider ldap
    AuthzLDAPAuthoritative On

    #注意ldap路径的方式,用户和组使用CN,组织单元使用OU
    AuthLDAPURL ldap://dc01.toxingwang.com:389/OU=admin,DC=toxingwang,DC=com?sAMAccountName?sub?(objectClass=*)
    AuthLDAPBindDN nagiosadmin@toxingwang.com   ##与AD通讯的账号,任意普通账号即可
    AuthLDAPBindPassword password    ##上述账号的密码,注意,明文方式,因此一定使用普通账号
   #如下一行可定义基于指定ou下的用户验证
   #Require valid-user
   #如下两行定义基于指定组的认证
   AuthLDAPGroupAttributeIsDN on    ##开启基于组的验证

   #组对应的ldap路径
   require ldap-group CN=nagiousers,OU=admin,DC=toxingwang,DC=com
</Directory>

注意需要替换所有用到验证的地方(包含pnp4nagios的httpd配置)。然后重启httpd即可使用域账号登录nagios了。当然可以访问nagios的web页面,不一定具有查看相关监控服务的权限,下面进行定义:

3.2 定义联系人:

3.2.1 定义联系人:

打开Nagios的contacts.cfg文件,定义每一个就具有权限的用户:

define contact {
        contact_name                    barlow   ##需要与WindowsAD域中的账号相同
        alias                           Barlow

        ##如下两行定义通知方式,后面会详细讲到
        host_notification_commands      notify-host-by-email,notify-host-by-message
        service_notification_commands   notify-service-by-email,notify-service-by-message
        email                           barlow@toxingwang.com  ##定义通知邮箱
        address1                        18000000000   ##定义短信通知手机
        use                             generic-contact     ##使用通用模板
        register                        1   ##是否启用
        }

3.2.2 定义联系人组:

按用户管理服务的不同,定义相关的联系人组,如DBA管理组、OA管理组、网络管理组、SAP管理组等,编辑contactgroups.cfg

define contactgroup {
        contactgroup_name               admins
        alias                           Nagios Administrators
        members                         barlow
        register                        1
}

define contactgroup {
        contactgroup_name               netadmins
        alias                           Network Administrators
        members                         zhangsan,barlow,lisi   ##组内包含的用户
        register                        1
}

3.2.3 使用服务模板和主机模板的方式实现权限管理:

与联系人组定义思想相同,按权限不同,将相关联系人组和联系人加入到服务模板和主机模板,以后在定义服务是引用该模板即可,具体实现如下:

编辑主机模板文件:hosttemplates.cfg

define host {
        name                            generic-network-admins
        contact_groups                  netadmins   ##将上诉定义的联系人组加入
        register                        0
}

以后在定义主机时,如果需要改组用户具有此主机的权限,则引用该模板即可。

编辑服务模板文件:servicetemplates.cfg

define service {
        name                            network-service-admins

        #如下几行定义通知机制,可根据需要调整
        #notification_interval           30
        #notification_period             24x7
        #notification_options            w,u,c,r
        #notifications_enabled           1
        contact_groups                  admins,netadmins
        register                        0
}

同使用主机模板一样,在以后定义服务时,如果需要用户具有查看该服务的权限,则引用模板即可。

3.3 使用Mail和短信双重报警:

我使用sendEmail脚本(脚本下载)发送通知邮件,命令定义如下:

define command {
        command_name                    notify-service-by-email
        command_line                    /usr/bin/printf "%b" "**Server Info for $HOSTALIAS$**\nAdditional Info:\n\n$SERVICEOUTPUT$\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nIf you have any questions, please send email to barlow@toxingwang.com or call my phone 13360052520\n" | /usr/local/sendEmail/sendEmail –f <发件人邮箱> -t $CONTACTEMAIL$ –s <smtp服务器> -u "$NOTIFICATIONTYPE$ Service:$HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$"   -xu <发件人账号(邮箱)>  -xp <发件人密码> -o message-charset=utf-8 -o message-header=utf-8
        register                        1
}

短信通知功能可以使用短信猫、飞信、或者其他短信接口实现,我使用公司短信结构实现,命令定义如下:

define command {
        command_name                    notify-service-by-message
        command_line                    $USER1$/sendmessage.py $CONTACTADDRESS1$ "$NOTIFICATIONTYPE$ Service:$HOSTALIAS$ / $SERVICEDESC$ is $SERVICESTATE$!$SERVICEOUTPUT$ –by Nagios"
        register                        1
}

抱歉!评论已关闭.

×