如何解析Zabbix JSON并发送至Rundeck?JSON解析报错求助
Zabbix触发Rundeck时JSONDecodeError问题排查与解决
核心错误原因
JSON解码失败通常是以下三种情况导致:
- Zabbix推送的Payload本身不是合法JSON(比如缺少闭合引号、逗号错误、特殊字符未转义)
- 脚本接收输入的方式错误(比如Shell拆分了JSON参数,导致结构破损)
- 编码不兼容(Payload含非UTF-8字符,解析时未指定编码)
分步排查与修复
1. 先确认原始Payload的合法性
在脚本开头添加日志代码,把Zabbix传递的原始内容完整写入文件,方便排查:
import sys # 写入原始Payload到日志 with open('/tmp/zabbix_raw_payload.log', 'w') as log_file: log_file.write(sys.stdin.read())
触发告警后,用python -m json.tool /tmp/zabbix_raw_payload.log命令验证JSON格式。如果命令报错,说明Zabbix的Payload模板有问题,需要调整模板修正语法错误。
2. 修正脚本的JSON解析逻辑
从标准输入读取Payload的场景
确保读取完整输入,同时添加异常捕获并记录错误详情:
import json import sys try: # 读取完整输入并去除首尾空白 raw_payload = sys.stdin.read().strip() if not raw_payload: raise ValueError("未接收到有效Payload") # 解析JSON trigger_data = json.loads(raw_payload) except json.JSONDecodeError as decode_err: # 记录解码错误位置和原始数据 with open('/tmp/json_decode_error.log', 'a') as err_log: err_log.write(f"解码错误位置:{decode_err.pos},错误信息:{decode_err.msg}\n") err_log.write(f"原始Payload:{raw_payload}\n") sys.exit(1) except Exception as general_err: with open('/tmp/script_error.log', 'a') as err_log: err_log.write(f"脚本异常:{str(general_err)}\n") sys.exit(1)
从命令行参数读取Payload的场景
Shell会拆分含空格、引号的参数,需要拼接所有参数为完整JSON字符串:
import json import sys try: # 拼接所有命令行参数为完整JSON raw_payload = ' '.join(sys.argv[1:]).strip() trigger_data = json.loads(raw_payload) except json.JSONDecodeError as decode_err: with open('/tmp/json_decode_error.log', 'a') as err_log: err_log.write(f"解码错误:{decode_err}\n原始数据:{raw_payload}\n") sys.exit(1)
3. 处理编码与特殊字符问题
如果Payload包含中文或非ASCII字符,确保用UTF-8编码解析:
raw_payload = sys.stdin.read().strip().encode('utf-8').decode('utf-8')
同时检查Zabbix触发器模板,确保双引号、反斜杠等特殊字符已正确转义(比如用\"代替")。
4. Rundeck调用的额外检查
- 脚本向Rundeck发送请求时,必须设置
Content-Type: application/json请求头,否则Rundeck无法正确解析请求。 - 确认Zabbix服务器IP已加入Rundeck的API访问白名单,且调用用户拥有重启服务的权限。
内容的提问来源于stack exchange,提问作者manthysBR
相关产品推荐
相关产品推荐

