zabbix api configuration.import 必须传 base64 编码的 xml 字符串并指定 format="xml",且 xml 中引用的主机组、模板等必须已存在,否则报错或静默失败。

zabbix_api.py 调用 configuration.import 时返回 “Invalid params”
直接传 XML 字符串或文件路径都会失败,因为 Zabbix API 的 configuration.import 方法不接受原始 XML 文本或本地路径,它只认 Base64 编码后的字符串 + 明确指定的 format 参数。常见错误是把 xml 当成格式名传进去,实际必须用 xml 对应的合法值:xml(没错,字面就是 "xml",但大小写敏感且不能加空格)。
- 确保 XML 内容已读取为字符串,并用
base64.b64encode(...).decode("utf-8")编码(Python)或等效方式(如 JS 的btoa) -
format字段必须是字符串"xml",不是"XML"、"Xml"或"xml_file" - 请求体中不要包含
rules字段除非你明确需要覆盖行为;默认规则已足够导入模板
Python 脚本上传模板时提示 “No permissions to referred object or it does not exist”
这个错误和权限无关,大概率是 host_group 或 template 在 XML 中引用了 Zabbix 里不存在的组名或模板名。Zabbix 导入时会校验 <groups></groups> 和 <templates></templates> 下的 <name></name> 是否已在当前实例中存在。
- 检查 XML 模板里的
<groups><group><name>Linux servers</name></group></groups>—— 这个Linux servers必须已在 Zabbix 前端或通过 API 创建好 - 如果模板依赖其他模板(如继承自
Template OS Linux),确保目标 Zabbix 实例中已存在该模板,且名称完全一致(区分大小写) - 临时解决办法:编辑 XML,删掉整个
<groups></groups>节点,或把<groups></groups>留空;导入后再手动关联主机组
import base64
import requests
url = "https://zabbix.example.com/zabbix/api_jsonrpc.php"
auth_token = "your_auth_token_here"
with open("template_linux_custom.xml", "rb") as f:
xml_content = f.read()
encoded_xml = base64.b64encode(xml_content).decode("utf-8")
payload = {
"jsonrpc": "2.0",
"method": "configuration.import",
"params": {
"format": "xml",
"source": encoded_xml,
"rules": {
"templates": {"createMissing": True},
"applications": {"createMissing": True},
"items": {"createMissing": True, "updateExisting": True},
"triggers": {"createMissing": True, "updateExisting": True},
"graphs": {"createMissing": True, "updateExisting": True}
}
},
"auth": auth_token,
"id": 1
}
response = requests.post(url, json=payload, verify=False)
print(response.json())
curl 命令行导入 XML 模板总卡在 400 错误
用 curl 直接 POST XML 文件容易忽略两个关键点:一是 JSON payload 中 source 必须是 Base64 字符串(不能是 @file),二是 Content-Type 必须为 application/json,否则 Zabbix 返回 400 且无有效提示。
- 先用
base64 -i template.xml | tr -d '\n'得到单行 Base64 字符串(macOS 用base64 -i,Linux 用base64 -w0) - 拼 JSON 时确保
source值用双引号包裹,且不含换行 —— 否则 JSON 解析失败 - 别漏掉
-H "Content-Type: application/json",这是 curl 默认不带的
导入后模板没出现在“Configuration → Templates”列表里
不是失败,而是模板被导入但处于“未启用”状态,或者被自动归类到“Templates created by user”这类隐藏分组。Zabbix Web UI 默认不显示未启用模板,也不在所有分组中默认展开。
- 登录 Zabbix 前端,在“Configuration → Templates”右上角点“Filter”,勾选 “Show disabled templates”
- 检查 XML 中是否含
<status>1</status>(1 表示禁用,0 表示启用);若为 1,导入后需手动启用,或改 XML 后重传 - API 导入不会触发模板自动链接到主机,必须后续调用
template.link或在前端手动操作
hostid(如果 XML 里硬编码了 ID)都可能让导入静默失败或半成功。动手前先用 zabbix_get 或 API 查一遍目标环境里已有哪些组和模板,比反复试错快得多。










