部署过很多次nagios监控系统。但此次部署时,出现nrpe调用脚本的执行结果和本地执行不一致的情况。具体如下:
以gmond的为例:
在被监控主机上执行gmond的监控脚本
显示结果为OK - Gmond is running.
在nagios server上面,通过nrpe调用
./check_nrpe -H 192.168.181.13 -c mycheck_gmond
结果为:Critical - Gmond is down.
看下gmond的脚本
#!/bin/sh
var3=`sudo service gmond status|awk NR==3 `;
var1=`echo $var3 | awk '{print $3}' `;
if ( [ $var1 = "(running)" ] ) ; then
echo "OK - Gmond is running."
exit 0
else
echo "Critical - Gmond is down."
exit 1
fi
显示,在server调用,var1
应该不是running
。
最好的调试方法,就是输出日志到文件。
在脚本中,添加了
echo var3 > /tmp/nagios.log
echo var1 >> /tmp/nagios.log
用nrpe调用,发现,打印了两行空值。
也就是说第一行就出错了。那应该就是sudo权限的问题了。
当采用nrpe调用的时候,在被监控主机上,实际上执行监控脚本的就是在被监控主机上运行nrpe的用户。
在我这里,实际就是nrpe这个用户。查看visudo
nrpe ALL=(ALL) NOPASSWD: ALL
放下nrpe已经有sudo权限了。
切换到nrpe用户执行一下这个语句。由于nrpe是/sbin/nologin
,因此是无法登录的。手工修改一下, 发现是可以执行sudo语句。
到此,就不知道原因是什么了。搞了一整天。
晚上在网上搜的时候,发现visudo里面有这样一个选项:
Defaults requiretty
意思就是只有登录到tty,才能执行sudo命令。
事实发现就是这个问题。坑啊。。。
另外,如果实在分析不出来,可以在nrpe的commans定义时,添加:
>>/tmp/output 2>&1
这样,就可以通过日志分析。
日志是非常重要的排错手段。