【问题标题】:NSClient++ commands for NRPE with Windows Server 2012 from Icinga用于 NRPE 的 NSClient++ 命令与来自 Icinga 的 Windows Server 2012
【发布时间】:2013-11-18 14:58:39
【问题描述】:

我已经研究这个问题好几天了,但我无法找到解决方案。 我有一个安装了 NSClient++ 的 Windows 2012 服务器。我还有一个安装了 Nagios NRPE 插件的 Icinga 服务器。此外,NSClient++ 被配置为接受 NRPE 命令并设置了“允许参数 = 1”。 从 Icinga 服务器,当我给出这个输入时:

/usr/lib/nagios/plugins/check_nrpe -H 192.168.1.22 -c alias_cpu

它给出了这个: OK CPU 负载正常。|'5m'=27%;80;90 '1m'=26%;80;90 '30s'=26%;80;90


所以一切看起来都很好,但是从 Icinga 网络界面,我得到了这个错误: /usr/lib/nagios/plugins/check_nrpe: 选项需要一个参数 -- 'a'

看起来我只是无法正确使用命令。我尝试了在互联网上找到的所有命令,但没有一个能正常工作。此外,NRPE 的 NSClient 文档已经过时,因为他们说您应该使用 check_nt 但该命令已弃用一年多,所以我应该使用 check_nrpe 但那也不起作用。

所以我在 /etc/icinga/objects 中创建了一个 .cfg 文件,我目前正在使用这些命令:

define host{
       use windows-servers
       host_name host.domain.com
       alias host
       address 192.168.1.22
}

define service{
        use                             generic-service
        host_name                       host.domain.com
        service_description             Drive Usage
        check_command                   check_nrpe!alias_disk
        }


define service{
        use                     generic-service
        host_name               host.domain.com
        service_description     CPU Load
        check_command           check_nrpe!alias_cpu
}

在 Windows Server 上,nsclient.ini 中的设置如下:

[/settings/NRPE/server]
allowed hosts=172.16.0.7
allow arguments=1
port=5666
allow nasty_meta chars=1 
use SSL = 1

有人知道这里出了什么问题吗?我现在完全没有选择了。 我是否给出了错误的命令?有谁知道正确的命令?还是我做错了什么? 谢谢!

【问题讨论】:

    标签: debian monitoring nagios nrpe


    【解决方案1】:

    这几个月大了,但我想权衡一下。

    您的解决方案(切换 check_nrpe 和 check_nrpe_1arg 的命令定义)不是最佳解决方案。当您想要传递外部命令及其命令行选项时使用 check_nrpe,而当您只想传递外部命令时使用 check_nrpe_1arg(这是您尝试执行的操作)。

    对于您的用例,最好的解决方案是将 check_nrpe 和 check_nrpe_1arg 命令定义保持原样,并更改您的服务定义以使用正确的命令:

    define service{
        use                             generic-service
        host_name                       host.domain.com
        service_description             Drive Usage
        check_command                   check_nrpe_1arg!alias_disk
        }
    
    
    define service{
        use                             generic-service
        host_name                       host.domain.com
        service_description             CPU Load
        check_command                   check_nrpe_1arg!alias_cpu
    }
    

    另一方面,如果您想将命令行选项传递给 nrpe,则可以使用 check_nrpe 命令。像这样:

    define service {
         use                            generic-service
         host_name                      host.domain.com
         service_description            Check SMART status of sda
         check_command                  check_nrpe!check_smart!/dev/sda
         }
    

    (假设您在 nrpe.cfg 中定义了以下 check_smart 命令):

    command[check_smart]=/usr/lib/nagios/plugins/check_ide_smart -d $ARG1$
    

    【讨论】:

      【解决方案2】:

      在 Icinga/Nagios 论坛的帮助下,我发现 define_command 是这样的:

      # this command runs a program $ARG1$ with arguments $ARG2$
      define command {
              command_name    check_nrpe
              command_line    /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a $ARG2$
      }
      
      # this command runs a program $ARG1$ with no arguments
      define command {
              command_name    check_nrpe_1arg
              command_line    /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
      }
      

      应该是这样的:

      # this command runs a program $ARG1$ with arguments $ARG2$
      define command {
              command_name    check_nrpe_1arg
      
              command_line    /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a $ARG2$
      }
      
      # this command runs a program $ARG1$ with no arguments
      define command {
              command_name    check_nrpe
              command_line    /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
      }
      

      只换了两行,但花了我几天的时间才找到。不过好在现在已经解决了。

      【讨论】:

        【解决方案3】:

        在经过认真调试后,我发现(在 Icinga 2 上进行测试)是,将 check 命令的参数拆分为不同字符串的方式会影响它们传递给子进程的方式。这可能是一个非常大的问题,具体取决于子进程如何在内部处理命令行参数。这是一个特别棘手的现实例子:

        object CheckCommand "cc-cisco-interface-status" {
          import "plugin-check-command"
        
          command = [ PluginDir + "/check_snmp_ifname.sh",
                     "-H", "$host.address$",
                     "-P 2c",
                     "-C", "$host.vars.snmpcommunity$",
                     "-o", "IF-MIB::ifOperStatus",
                     "-IF", "$service.vars.ifname$"
                    ]
        

        所以通过这个命令,子进程接收到:

        $1 = -H
        $2 = 1.1.1.1
        $3 = -P 2c
        $4 = -C
        $5 = MyCommunity
        $6 = -o
        $7 = IF-MIB::ifOperStatus
        $8 = -IF
        $9 = Serial0/0/0:0
        

        这让我们发疯了,例如,

                     "-IF", "$service.vars.ifname$"
        $8 = -IF
        $9 = Serial0/0/0:0
        

        工作时

                     "-IF $service.vars.ifname$"
        $8 = -IF Serial0/0/0:0
        

        没有。

        但我认为,一旦您了解发生了什么,这将成为一个易于管理的问题(甚至方便,因为它可以让您很好地控制引用的字符串)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-21
          • 2018-04-22
          相关资源
          最近更新 更多