记一次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 许可协议。转载请注明出处!