首页 文章

来自Icinga的Windows Server 2012的NRPE的NSClient命令

提问于
浏览
1

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

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

它给出了这个: OK CPU Load ok.|'5m'=27%;80;90 '1m'=26%;80;90 '30s'=26%;80;90

所以一切看起来都很好,但是从Icinga web界面,我得到这个错误:/ usr / lib / nagios / plugins / check_nrpe:option需要一个参数 - '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

有谁知道这里出了什么问题?我现在完全没有选择 . 我给错了命令吗?有谁知道正确的命令?或者我做错了什么?谢谢!

3 回答

  • 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$
    }
    

    只交换了两条线,但花了几天时间才发现 . 但幸运的是,它现在已经解决了 .

  • 1

    在经过一些严肃的调试之后我发现(在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
    

    才不是 .

    但是我认为一旦你理解了正在发生的事情,这就变成了一个可管理的问题(甚至很方便,因为它可以让你对引用的字符串有一个非常好的控制) .

相关问题