1

我已经研究这个问题好几天了,但我无法找到解决方案。我有一个安装了 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 Load ok.|'5m'=27%;80;90 '1m'=26%;80;90 '30s'=26%;80;90


所以一切看起来都很好,但是从 Icinga 网络界面,我得到了这个错误:/usr/lib/nagios/plugins/check_nrpe: option requires an argument -- '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 服务器上,nsclient.ini 中的设置如下:

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

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

4

3 回答 3

2

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

您的解决方案,切换 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$
于 2014-02-20T16:33:11.433 回答
1

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

只换了两条线,但花了我几天的时间才找到。但幸运的是,现在已经解决了。

于 2013-11-19T23:58:38.537 回答
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

才不是。

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

于 2014-05-22T18:17:32.410 回答