该文档只针对于配置   打乱了commands.cfg templates.cfg contacts.cfg localhost.cfg  timeperiods.cfg  resource.cfg 讲解

在讲配置之前最重要的一个命令:
    nagios目录/bin/nagios -v nagios.cfg  (这是调试是否配置有错的命令参数 -v  很有用)
    
步入正题:

笔者认为了解nagios先得了解工作的逻辑:
nagios程序调用监控顺序:
        首先读取第一个配置文件 nagios.cfg  根据配置的 cfg_file cfg_dir  指定的目录或者文件读取地址
        不管是目录 还是 文件 都应该读取的东西
        1.命令
        2.联系人(组)
        3.时间
        4.执行监控的主要入口
        
        也许你会问为什么不列出 ”1.commands.cfg  命令配置文档 “ 这样的目录 原因是我根据网上这样说的 压根没理解说的什么。。
        
        
        有了上边4样东西 nagios 就可以运行了
        
        相互调用关系:
        
        在讲相互调用关系之前应该先了解的是 执行监控的主要入口
        
        nagios的监控  是基于 主机 和服务的  先有主机 后有服务 这点很重要 缺一不可
        
        主机有对与主机的监控(ping)  服务有对于服务的监控(disk)
        
        在往下延伸
        
        先说主机:
                  nagios 需要先使用 define host{}定义主机  包含的内容 为了便于理解将分3个部分讲:
        一、部分主机配置:  
        hostname      主机名         ;定义监控的主机名
        alias            别名        ;定义别名
        address            ip            ;定义监控主机的IP地址
        
        二、执行命令:
        check_command         监控命令  ;本文第一次调用命令  配置对主机的监控命令  (1.命令 也就是 commands.cfg)
        check_period          时间段名字   ;本文第一次调用时间  监控实施的时间段 (3.时间 也就是timeperiods.cfg)
        check_interval        数字        ;检查完毕下一次多久检查
        max_check_attempts         数字   ;定义命令检查失败了 重试次数
        retry_interval          数字    : 重试命令间隔时间

        三、报警通知:
        notification_options   d,u,r    ;当主机出现d—当机(down),u—返回不可达(unreachable),
                                          ,r—从异常情况恢复正常,在这3种情况下通知联系人 (通知还有两个属性 f,s )
        contact_groups          联系人组名   ;本文第一次调用联系人(组) 配置通知联系人组  (2.联系人(组)  也就是contacts.cfg)
        notification_interval   时间单位分钟  ; 每个多少分钟重发通知
        notification_period    时间段名字     ;本文第二次调用时间   发送通知的时间段  (3.时间 也就是timeperiods.cfg)
        
        通过三部分 大致可以对主机的监控解读:
        1.配置主机   
        2.配置监控命令
        3.通过配置的监控命令 调用commands.cfg 去执行监控命令
            ->并根据配置的时间段名字 调用timeperiods.cfg时间段配置 规定监控命令执行时间
        4.如果触发 d,u,r 则启动报警装置
            ->根据时间段名字 调用timeperiods.cfg时间段配置 规定报警执行时间
            ->根据联系人组名 调用contacts.cfg文件配置  对联系人组下的 联系人发起通知报警(后边会详细解说)
        
        
        再说服务:
                nagios把所有对服务的监控定义在define service{}里  也分为三部分讲:
                一、部分主机配置:
                host_name               主机名  ;设置主机名 应 与 主机监控名字对应  因为服务是与主机相对应的 而且服务并未指定地址
                service_description     描述    ;标签的意思比如这是监控磁盘的 就定义为disk 等等。。
                
                二、执行命令:
                check_command              监控命令  ;本文第二次调用命令  配置对主机服务的监控命令  (1.命令 也就是 commands.cfg)
                check_period          时间段名字   ;本文第三次调用时间  监控实施的时间段 (3.时间 也就是timeperiods.cfg)
                normal_check_interval        数字        ;检查完毕下一次多久检查
                max_check_attempts         数字   ;定义命令检查失败了 重试次数
                retry_check_interval           数字    : 重试命令间隔时间
                
                三、报警通知:
                notification_options    w,u,c,r    ;当主机出现w—警告(warning),u—返回不可达(unreachable),c-特别严重(critical)
                                                  ,r—从异常情况恢复正常,在这3种情况下通知联系人 (通知还有两个属性 f,s )
                contact_groups          联系人组名   ;本文第二次调用联系人(组) 配置通知联系人组  (2.联系人(组)  也就是contacts.cfg)
                notification_interval   时间单位分钟  ; 每个多少分钟重发通知
                notification_period    时间段名字     ;本文第四次调用时间   发送通知的时间段  (3.时间 也就是timeperiods.cfg)
        
        如果说之前的主机配置你明白了 我想服务配置也不难理解了:        
        1.配置主机  (与主机配置相同)
        2.配置监控命令
        3.通过配置的监控命令 调用commands.cfg 去执行监控命令
            ->并根据配置的时间段名字 调用timeperiods.cfg时间段配置 规定监控命令执行时间
        4.如果触发 w,u,c,r 则启动报警装置
            ->根据时间段名字 调用timeperiods.cfg时间段配置 规定报警执行时间
            ->根据联系人组名 调用contacts.cfg文件配置  对联系人组下的 联系人发起通知报警(后边会详细解说)
            
        根据以上调用 如果将以上的配置 配置为localhost.cfg (ps 实际上以上内容分为2个文件在完成 这也是困扰我理解的地方 templates.cfg+localhost.cfg
                                                            组合才构建了以上的内容 在最后讲解)
        那么我们还需要commands.cfg   timeperiods.cfg   contacts.cfg  即可将监控跑起来了
        
        
        这里我们先讲最简单的  timeperiods.cfg 也是调用最多的:
        对于时间段 nagios 使用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
                    }


        因为该文件的简单 至使我觉得没大必要将   以上内容就是每天的意思  24*7  一周24小时嘛   然后是别名  周日-周六配置  而这个也是我们用得最多的
        
        下一个将联系人和组 也就是 contacts.cfg 文件  该文件定义了 联系人 和组 分2部分讲解:
        一、联系人
        联系人 nagios 是以 defind contact{}定义的:
        contact_name                    联系人名   //配置联系人名字
        alias                           别名         //配置别名
        service_notification_commands   notify- service -by-email(执行命令)     //这是第三次调用命令  (1.命令 也就是 commands.cfg)
                                                                                    实际上就是根据email 的目的地 使用 mail 命令 发送邮件这里就不多说了
        service_notification_options    w,u,c,r    //这里简写了 对于警告,未知错误,严重以及恢复  才会发送邮件
        service_notification_period     24x7         //第五次调用时间    在该时间段 才会调用发邮件的命令  (3.时间 也就是timeperiods.cfg)
        host_notification_commands      notify- host--by-email(执行命令)   //这是第四次调用命令   (1.命令 也就是 commands.cfg)
        host_notification_options       d,u,r             //对于主机的宕机  未知  恢复 才会发邮件
        host_notification_period        24x7             //第六次调用时间    在该时间段 才会调发邮件的命令  (3.时间 也就是timeperiods.cfg)
        email                           yahoon@test.com    //发送邮件的目的地址  
        (ps  要使得发邮件  需要配置sendmail 服务 后边命令会讲到)
        二、组
        联系组 nagios 是以 defind contactgroup{}定义的:
        define contactgroup{
                    hostgroup_name          联系人组名  //联系人组名称   这里的组名 和上边的主机监控 和 服务监控相对应
                    alias                   别名  //别名
                    members                 联系人   //这里可以添加多个联系人 以,号隔开 必须是上面联系人中定义的
                    }
        
        联系人和组部分涉及的内容也不是很多 大致可以这样理解:
        通过第一次调用的联系人组  然后访问同联系人组名的 hostgroup 然后根据members 设置的联系人  调用   与 同联系人名的 contact
        然后根据配置的警报机制 发送警报
        
        
        有了之上的了解 这里我简要介绍下报警工作流程:
        先说说主机:
            首先通过define host{}  根据配置的主机名信息 进行执行命令检查 如果检查失败 将会重试检查  如果重试失败 将根据报警通知的内容 第一次过滤哪些情况 通知 联系组
            之后通过联系组配置defind contactgroup{}  配置的联系人  调用用联系人配置defind contact{}  然后进行第二次过滤 过滤哪些情况调用发邮件命令
            
        不知道 到现在思路清晰了没有?
        
        如果清晰了 那么请接着往下看:
        
        大致流程都讲解了 唯一还未涉及的 还有命令 也就是commands.cfg配置的内容:
        
        
        命令 算nagios 的重点内容了  不熟悉传递参数 语法 也将得不到我们想要的效果
        
        首先我们了解 大致的 commands.cfg 语法他的定义都是使用 define command{}定义的
      

define command{
        command_name    命令命名  //这里的名称  和之前调用 使用的名称相对应  主要用于命令调用
        command_line    执行命令   //这里则是调用真正的linux 命令  或者说调用 nagios 内置插件命令
        }


        
        定义很简单  我觉得 更应该说的是 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$
        服务:/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$\n" | /bin/mail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$

        我认为我们应该先了解他的变量主机监控相关变量: %b  $NOTIFICATIONTYPE$  $HOSTNAME$   $HOSTSTATE$   $HOSTADDRESS$  $HOSTOUTPUT$  $LONGDATETIME$  $CONTACTEMAIL$
                                    服务监控相关变量:%b   $$NOTIFICATIONTYPE$ $SERVICEDESC$  $HOSTALIAS$  $HOSTADDRESS$  $SERVICESTATE$   $LONGDATETIME$ $SERVICEOUTPUT$  $CONTACTEMAIL$
        主机:
                %b 为printf的参数  不过我也不是很理解 为什么这里要%b 其实不要 一样可以解析参数 不纠结。。
                $NOTIFICATIONTYPE$  表示通知的类型(如主机的 d,u,r 的全称等)
                $HOSTNAME$是该监控项所属主机,即定义服务或者主机监控定义的  主机名称 host_name 的值
                $HOSTSTATE$  该主机 的状态
                $HOSTADDRESS$  主机地址
                $HOSTOUTPUT$   主机信息报错输出内容
                $LONGDATETIME$  当前时间信息
                $CONTACTEMAIL$  为配置联系人  设置的 email 地址
        
        服务:
            $NOTIFICATIONTYPE$  表示通知的类型(服务的 w,c,r,u,r 的全称等)
            $SERVICEDESC$  服务描述
            $HOSTALIAS$        主机名
            $HOSTADDRESS$     主机地址 为主机监控的配置的address地址
            $SERVICESTATE$    服务状态
            $LONGDATETIME$  当前时间信息
            $SERVICEOUTPUT$   服务信息报错输出内容
            $CONTACTEMAIL$  为配置联系人  设置的 email 地址
            
        这里要说一下  如果我简写 命令则为:
            
            printf %b" "内容" | mail -s "标签"  邮件地址
        
        实际上是调用了linux 系统 mail 命令  所以应该配置好linux 上的mail命令
            yum install mail
            配置 /etc/mail.rc :
            set from=发送邮件地址
            set smtp=smtp服务器地址
            set smtp-auth-user=发送邮件地址
            set smtp-auth-password=邮件密码
            set smtp-auth=login
        即可 可以使用 printf %b" "内容" | mail -s "标签"  邮件地址   测试
        
        然后我们说说常规的一些命令:
            
     

[root@postgres-master libexec]# ./check_disk -w 10% -c 5% -p /
        DISK OK - free space: / 4050 MB (15% inode=89%);| /=22327MB;25010;26399;0;27789
        [root@postgres-master libexec]# ./check_disk -w 10% -c 50% -p /
        DISK CRITICAL - free space: / 4050 MB (15% inode=89%);| /=22327MB;25010;13894;0;27789
        [root@postgres-master libexec]# ./check_disk -w 50% -c 50% -p /
        DISK CRITICAL - free space: / 4050 MB (15% inode=89%);| /=22327MB;13894;13894;0;27789
        [root@postgres-master libexec]# ./check_disk -w 50% -c 50% -p / |awk '{print $2}'
        CRITICAL


        
        这是我做的check_disk 的实验  -w 为警告 -c 为严重
        他的状态 很可能是提取  反馈信息中的第二项值来判断是否报警 我们先姑且这么认为(笔者也学习不久)
        
        那么在nagios 怎么实现的呢?
        
        nagios 以! 做为分隔符传递参数 我们来看看这个例子:
      

define service{
                check_command                   check_local_disk!10%!10%!/boot   //调用 名字为  check_local_disk 的命令 传递 3个参数
        }
        define command{
        command_name    check_local_disk        //被调用的命令名字
        command_line    $USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$  //需要传递三个参数  $ARG1$ 为第一个参数 为10%    $ARG2$ 为10%  $ARG3$为/boot
        }


        $USER1$ 这一个参数 是在 resource.cfg 文件配置的:
        

$USER1$=/usr/local/nagios/libexec


        这里其实也可以直接使用:
      

command_line   /usr/local/nagios/libexec/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$


        (resource.cfg 在nagios.cfg里边配置resource_file=/usr/local/nagios/etc/resource.cfg 主要是做环境变量用的)
        
        
        这样就完成了一个 执行 本地check_disk命令 懂了这个 其实也迎刃而解了 我来看看负载:
        
    

[root@postgres-master libexec]# ./check_load 
        check_load: Could not parse arguments
        Usage:
        check_load [-r] -w WLOAD1,WLOAD5,WLOAD15 -c CLOAD1,CLOAD5,CLOAD15
        [root@postgres-master libexec]#


        相对应的为  1分钟 10分钟 15分钟 平均负载量
        -w 为警告 -c 为严重
        
        如果我们写 大概应该这样:
              

define service{
                check_command                  load!3,2,1!9,8,7
        }
        define command{
        command_name    load        //被调用的命令名字
        command_line    $USER1$/check_disk -w $ARG1$ -c $ARG2$
        }


        
        到这里 我想你应该明白了许多  其实一开始 困扰我的 是  use 这一个参数 如果你也觉得use困扰不妨往下看以下 内容将引用上templates.cfg :
        
        
        模板  这个内容相当的绕  致使笔者了解了很久才 明白 nagios 配置到底怎么回事:
        
        语法  是什么类模块  就用什么类的定义:
        
        比如我要定义 服务类的模块 该模块做一件事情  调用 模块名 只定义检查 和 报警 :
      

define service{
                name        定义模块名
                一、执行命令:
                check_command              监控命令 
                check_period          时间段名字   
                normal_check_interval        数字        
                max_check_attempts         数字  
                retry_check_interval           数字    
                
                二、报警通知:
                notification_options    w,u,c,r  
                contact_groups          联系人组名  
                notification_interval   时间单位分钟 
                notification_period    时间段名字 
                
        }


        
        然后我要定义 192.168.1.100  和192.168.2.200 都要执行这个 模块 ():
      

192.168.1.100.cfg :
                            define host{
                                    host_name               192.168.1.100
                                    use                     192.168.1.100
                                    alias                   192.168.1.100
                                    address                 192.168.1.100

                                    }
                            define service{
                                    host_name                      192.168.1.100
                                    use                             定义的模块名
                                    }
                        
        192.168.2.200.cfg :
                            define host{
                                    host_name               192.168.2.200
                                    use                     192.168.2.200
                                    alias                   192.168.2.200
                                    address                 192.168.2.200

                                    }
                            define service{
                                    host_name                      192.168.2.200
                                    use                             定义的模块名
                                    }


        
        如果这个模块 是定义的 执行 nrpe 的命令检测磁盘  就可以做成一个模板 放在templates.cfg  调用即可  当然我们也可以做时间的 联系人的主机的
        
        如果你看到这儿 我想你在去看commands.cfg templates.cfg contacts.cfg localhost.cfg  timeperiods.cfg  resource.cfg这五个文件将迎刃而解
                
        
        
        
        
       


转载于:https://blog.51cto.com/qidai/1660777