我已经研究了这个问题好几天但我无法找到解决方案。 我有一个安装了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加载确定。|'5m'= 27%; 80; 90'1m'= 26%; 80; 90'30s'= 26%; 80; 90
所以一切看起来都很好,但是从Icinga web界面,我得到了这个错误:
/ usr / lib / nagios / plugins / check_nrpe:选项需要一个参数 - 'a'
看起来我无法正确地获得命令。我尝试了在互联网上找到的每一个命令,但没有一个能正常工作。另外,NRPE的NSClient文档已经过时了,因为他们说你应该使用 check_nt ,但是这个命令现在已经弃用了一年多,所以我应该使用check_nrpe,但这不能正常工作。 / p>
所以我在/ 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
有谁知道这里出了什么问题?我现在完全没有选择。 我给错了命令吗?有谁知道正确的命令?或者我做错了什么? 谢谢!
答案 0 :(得分: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$
答案 1 :(得分: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$
}
只换了两行,但花了几天时间才发现。但幸运的是,它现在已经解决了。
答案 2 :(得分: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
没有。
但我认为一旦你了解了什么,这就变成了一个可管理的问题(甚至很方便,因为它可以让你对引用的字符串有一个非常好的控制)。