jingshen 发表于 2019-1-13 11:09:05

浅谈 nagios监控配置

  该文档只针对于配置   打乱了commands.cfg templates.cfg contacts.cfg localhost.cfgtimeperiods.cfgresource.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 "标签"邮件地址   测试
      
      然后我们说说常规的一些命令:
            
      # ./check_disk -w 10% -c 5% -p /
      DISK OK - free space: / 4050 MB (15% inode=89%);| /=22327MB;25010;26399;0;27789
      # ./check_disk -w 10% -c 50% -p /
      DISK CRITICAL - free space: / 4050 MB (15% inode=89%);| /=22327MB;25010;13894;0;27789
      # ./check_disk -w 50% -c 50% -p /
      DISK CRITICAL - free space: / 4050 MB (15% inode=89%);| /=22327MB;13894;13894;0;27789
      # ./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命令 懂了这个 其实也迎刃而解了 我来看看负载:
      
      # ./check_load
      check_load: Could not parse arguments
      Usage:
      check_load [-r] -w WLOAD1,WLOAD5,WLOAD15 -c CLOAD1,CLOAD5,CLOAD15
      #
      
      相对应的为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.cfgtimeperiods.cfgresource.cfg这五个文件将迎刃而解
               
      
      
      
      
      




页: [1]
查看完整版本: 浅谈 nagios监控配置