Zabbix问题排查 - Value should be a JSON object
Zabbix配置了端口自动发现,由一个自定义脚本解析配置文件并获取端口,管理页面显示Value should be a JSON object,数据格式不正确。
在目标机运行发现脚本,输出格式正常:
# mongo_proxy_discovery.sh
{ "data": [ {"{#PORT}": 27001} ] }
了解到使用zabbix_get
可获取key的值,条件是在zabbix server端执行此命令。
尝试在开发机执行zabbix_get
命令,未获取结果。
# zabbix_get -s xxx.xxx.xxx.xxx -p 10050 -k "mongo_proxy_discovery"
同时观察到下面zabbix_agentd日志,意思说,仅接受zabbix server端发起的连接。
|
|
然而我没有zabbix server的登录权限,于是尝试让开发机充当zabbix server。
yum install zabbix-server
安装完成,修改目标机zabbix_agentd配置,将Server
和ServerActive
设置为开发机IP,重启zabbix_agentd。
Server=my.dev.host
ServerActive=my.dev.host
在开发机执行zabbix_get
命令,发现问题,没有配置文件的读权限,无法获取端口。
# zabbix_get -s xxx.xxx.xxx.xxx -p 10050 -k "mongo_proxy_discovery"
cat: /etc/mongo-proxy/test_27001.conf: Permission denied
{ "data": [ ] }
题外话,对zabbix只停留在基本使用阶段,比如模板、自动发现、自动注册等,知道zabbix是中心化服务,并不了解C/S两端如何交互,看来是S端主动poll数据。
后来了解到,调高zabbix_agentd日志级别也可以快速定位错误。
- 配置文件
|
|
- 错误日志
|
|
继续排查问题,检查配置文件权限,可读,没问题。
# ll /etc/mongo-proxy/test_27001.conf
-rw-r--r-- 1 root root 615 Mar 1 10:43 /etc/mongo-proxy/test_27001.conf
检查所在目录权限,可读,看起来也没问题。
drw-r--r-- 2 root root 4096 Mar 2 16:43 mongo-proxy
然后与之前部署的配置目录进行对比,发现之前目录权限是755,当前是644,于是将当前目录也设置为755,竟神奇般恢复正常。
chmod 755 /etc/mongo-proxy
su - zabbix -c "cat /etc/mongo-proxy/test_27001.conf"
这里说明一下,这钱使用纯shell脚本部署,使用mkdir
创建目录,采用默认目录权限,本次使用ansible脚本部署:
|
|
那么问题来了,目录没有x权限,为什么不能读取目录下文件的内容?
从《鸟哥的Linux私房菜》找到了答案:
x (access directory):
咦!目录的执行权限有啥用途啊?目录只是记录文件名而已,总不能拿来执行吧?没错!目录不可以被执行,目录的x代表的是用户能否进入该目录成为工作目录的用途! 所谓的工作目录(work directory)就是你目前所在的目录啦!举例来说,当你登入Linux时, 你所在的家目录就是你当下的工作目录。而变换目录的指令是『cd』(change directory)啰!
大致的目录权限概念是这样,底下我们来看几个范例,让你了解一下啥是目录的权限啰!
例题:
有个目录的权限如下所示:
drwxr–r– 3 root root 4096 Jun 25 08:35 .ssh
系统有个账号名称为vbird,这个账号并没有支持root群组,请问vbird对这个目录有何权限?是否可切换到此目录中?
答:
vbird对此目录仅具有r的权限,因此vbird可以查询此目录下的文件名列表。因为vbird不具有x的权限, 因此vbird并不能切换到此目录内!(相当重要的概念!)上面这个例题中因为vbird具有r的权限,因为是r乍看之下好像就具有可以进入此目录的权限,其实那是错的。 能不能进入某一个目录,只与该目录的x权限有关啦!此外, 工作目录对于指令的执行是非常重要的,如果你在某目录下不具有x的权限, 那么你就无法切换到该目录下,也就无法执行该目录下的任何指令,即使你具有该目录的r的权限。
参考