记一次zabbix_get远程执行取值为空问题

使用 zabbix CLI 工具 zabbix_get 获取 zabbix_agent 值时为空

问题背景

需要在 zabbix_agent 中使用自定义参数,使用 python脚本 编写了一个递归文件夹的函数去获取指定路径下的 tomcatJMX 配置信息,最终格式化为 json 输出,格式如下

脚本返回值 json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"data":[
{
"{#SERVER_IP}":"192.168.1.132",
"{#TOMCAT_NAME}":"tomcat_02",
"{#TOMCAT_PORT}":"20020"
},
{
"{#SERVER_IP}":"192.168.1.132",
"{#TOMCAT_NAME}":"tomcat_03",
"{#TOMCAT_PORT}":"20030"
},
{
"{#SERVER_IP}":"192.168.1.132",
"{#TOMCAT_NAME}":"tomcat_01",
"{#TOMCAT_PORT}":"20010"
}
]
}

在服务器本地运行没问题,输出格式如上。但是在 zabbix_server 服务器上通过命令行工具 zabbix_get 去获取结果如下:

shell
1
2
3
4
# zabbix_get -s 192.168.1.132 -p 10050 -k tomcat.discovery
{
"data":[]
}

问题分析

最开始自我怀疑是 python 脚本问题,在代码中关键位置添加 print 打印出相关执行步骤,发现脚本运行时在递归文件夹的时候会跳过一部分文件夹。那么猜测可能是 zabbix_get 是通过 zabbix_agent 远程执行,执行是使用的是 zabbix 用户,这个可以在 /etc/passwd 中查看到有此账号。

shell
1
2
# cat /etc/passwd | grep zabbix
zabbix:x:109:117::/var/lib/zabbix/:/bin/false

在尝试修改 python 代码去直接读取无法递归的文件后出现如下错误:

  • 尝试读取文件

    1
    2
    with open("/data/tomcat_01/bin/setenv.sh", "r") as f:
    print(f.read())
  • 结果

    shell
    1
    2
    3
    4
    5
    # zabbix_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 访问的文件路径给与可读权限。我这儿为了测试偷懒直接改了用户组

shell
1
# chown -R root.zabbix /data/

然后再次测试,可以正常访问了。结果如下

shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# zabbix_get -s 192.168.1.132 -p 10050 -k tomcat.discovery
{
"data":[
{
"{#SERVER_IP}":"192.168.1.132",
"{#TOMCAT_NAME}":"tomcat_02",
"{#TOMCAT_PORT}":"20020"
},
{
"{#SERVER_IP}":"192.168.1.132",
"{#TOMCAT_NAME}":"tomcat_03",
"{#TOMCAT_PORT}":"20030"
},
{
"{#SERVER_IP}":"192.168.1.132",
"{#TOMCAT_NAME}":"tomcat_01",
"{#TOMCAT_PORT}":"20010"
}
]
}

如果是使用 sudo 执行的话,要注意可能是 sudo 不允许远程执行,需要将 /etc/sudoers 中的一行注释就可以了。
如下:

/etc/sudoers
1
# Defaults   requiretty   #这行注释就可以了

使用root运行

推荐使用此方法

直接修改 /etc/zabbix/zabbix_agentd.conf,允许以root运行,内容如下:

/etc/zabbix/zabbix_agentd.conf
1
2
3
4
5
6
7
8
9
10
11
### Option: AllowRoot
# Allow the agent to run as 'root'. If disabled and the agent is started by 'root', the agent
# will try to switch to the user specified by the User configuration option instead.
# Has no effect if started under a regular user.
# 0 - do not allow
# 1 - allow
#
# Mandatory: no
# Default:
# AllowRoot=0
AllowRoot=1

保存后,停止并重新启动 zabbix_agent 后再次使用 zabbix_get 即可解决 zabbix_get Permission denied 问题了。

评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...