之前在http://chenx1242.blog.51cto.com/10430133/1839829 这篇文章里写了如何创建一个自定义的key来让zabbix进行实时的监控。但是也会有这样一种情况,那就是脚本在客户端上是可以跑通而且可以得到结果,但是在zabbix_get却死活无法正确的得到脚本结果,得到的是空值。如下图:

wKiom1e2uHOBFKuKAAArfm11JQc317.png

注意一下,ZBX_NOTSUPPORTED是key不对的意思,而下面那个就是得到空值的意思。


一般来说这种情况非常蛋疼,zabbix就是这么一个缺点:出问题不表现出来,但是zabbix还有一个优点,那就是问题都会在日志文件里,于是我们就在控制端打开zabbix_agentd.log,查看一下情况,结果日志如图:

1.png

看见了吧,在取key的时候,各种权限拒绝。这是因为zabbix_agent是由zabbix这个账户操作的,而这个用户本身是没有很多权限的,所以我们要给zabbix一些权限,让它可以成功的访问文件。于是我们#sudoedit /etc/sudoers,把原来的文件改成这样:

wKioL1e2ubvyQ71wAABBJh05mWk574.png

把zabbix跟root的权限平起平坐,而且还nopasswd,这样sudo的时候就不用每次都输入一次root的密码了,然后在不需要tty,文件改好了之后保存退出。


这个时候我们来写一个小脚本,这个脚本名叫get-payload,目的是要从/tmp/zksync/pms这个文件里取到一个payload的值。我们先看一下/tmp/zksync/pms这个文件内容,以及脚本里要使用的语句:

wKiom1e2upLhFNoDAAA6WomSaNs773.png

可以看到我们可以截取到8这个payload,然后脚本也就很好写了,脚本如下:

#!/bin/bash
payload=$(cat /tmp/zksync/pms | perl -n -e'/.*payload\":(\d+)\}\}/ && print $1') #这里我用正则匹配的,不是用上面的cut,效果一样的
echo $payload

然后把这个脚本的绝对路径放在zabbix_agentd.conf里,如图:

wKioL1e2u0zAEw1-AABlXD6TjKs966.png

注意哦注意哦,脚本的绝对路径前面是有sudo这四个字母的!:wq保存退出,并且重启zabbix_agent之后,来到zabbix_server端去get一下,看一下效果:

wKiom1e2u6Phu-fRAAAvZ61hY60131.png

无论是pid还是payload都能成功获取到数值,成功!!!


问题至此得到了解决,我们就可以在监控奇葩的项目的道路上越走越远了...