记一次zabbix_get远程执行取值为空问题
问题背景
需要在 zabbix_agent 中使用自定义参数,使用 python脚本 编写了一个递归文件夹的函数去获取指定路径下的 tomcat 的 JMX 配置信息,最终格式化为 json 输出,格式如下
1  | {  | 
在服务器本地运行没问题,输出格式如上。但是在 zabbix_server 服务器上通过命令行工具 zabbix_get 去获取结果如下:
1  | zabbix_get -s 192.168.1.132 -p 10050 -k tomcat.discovery  | 
问题分析
最开始自我怀疑是 python 脚本问题,在代码中关键位置添加 print 打印出相关执行步骤,发现脚本运行时在递归文件夹的时候会跳过一部分文件夹。那么猜测可能是 zabbix_get 是通过 zabbix_agent 远程执行,执行是使用的是 zabbix 用户,这个可以在 /etc/passwd 中查看到有此账号。
1  | cat /etc/passwd | grep zabbix  | 
在尝试修改 python 代码去直接读取无法递归的文件后出现如下错误:
尝试读取文件
1
2with open("/data/tomcat_01/bin/setenv.sh", "r") as f:
print(f.read())结果
shell 1
2
3
4
5zabbix_get -s 192.168.1.132 -p 10050 -k tomcat.discovery
Traceback (most recent call last):
File "/opt/zabbix/jmx_tomcat_discovery.py", line 85, in <module>
with open("/data/tomcat_01/bin/setenv.sh", "r") as f:
IOError: [Errno 13] Permission denied: '/data/tomcat_01/bin/setenv.sh'
可以看到 Permission denied 确实是由于权限问题导致。
解决方法
对zabbix用户授权
对需要 zabbix_agent 访问的文件路径给与可读权限。我这儿为了测试偷懒直接改了用户组
1  | chown -R root.zabbix /data/  | 
然后再次测试,可以正常访问了。结果如下
1  | zabbix_get -s 192.168.1.132 -p 10050 -k tomcat.discovery  | 
如果是使用 sudo 执行的话,要注意可能是 sudo 不允许远程执行,需要将 /etc/sudoers 中的一行注释就可以了。
如下:
1  | # Defaults requiretty #这行注释就可以了  | 
使用root运行
推荐使用此方法
直接修改 /etc/zabbix/zabbix_agentd.conf,允许以root运行,内容如下:
1  | ### Option: AllowRoot  | 
保存后,停止并重新启动 zabbix_agent 后再次使用 zabbix_get 即可解决 zabbix_get Permission denied 问题了。
- 本文标题:记一次zabbix_get远程执行取值为空问题
 - 本文作者:akiya
 - 本文链接:https://little-star.love/posts/34403a33/
 - 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
 






