目录

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端发起的连接。

1
 29760:20170302:172754.346 failed to accept an incoming connection: connection from "my.dev.host" rejected, allowed hosts: "actual.zabbix.server"

然而我没有zabbix server的登录权限,于是尝试让开发机充当zabbix server。

yum install zabbix-server

安装完成,修改目标机zabbix_agentd配置,将ServerServerActive设置为开发机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日志级别也可以快速定位错误。

  • 配置文件
1
2
3
4
5
6
7
# Specifies debug level:
# 0 - no debug
# 1 - critical information
# 2 - error information
# 3 - warnings (default)
# 4 - for debugging (produces lots of information)
DebugLevel=4
  • 错误日志
1
2
 15476:20170302:175926.726 for key [mongo_proxy_discovery] received value [cat: /etc/mongo-proxy/show_test_27001.conf: Permission denied
{ "data": [  ] }]

继续排查问题,检查配置文件权限,可读,没问题。

# 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脚本部署:

1
2
3
4
5
  - name: create directory /var/log/mongo-proxy
    file:
      path: /var/log/mongo-proxy
      state: directory
      mode: 0644

那么问题来了,目录没有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的权限。


参考