
除了内置媒体类型,Zabbix还支持自定义媒体类型吗?
- 来源:本站
- 编辑: 超级管理员
- 时间:2025-07-14 10:20:20
- 阅读1次
是的,Zabbix 支持通过 ** 自定义媒体类型(Media Types)** 扩展告警通知方式,允许集成任何第三方服务(如微信、钉钉、Slack、企业内部系统等)。以下是详细实现方法:
一、自定义媒体类型的实现方式
Zabbix 提供三种扩展机制:
脚本(Script)
通过编写 Shell/Python 脚本调用第三方 API。
适合快速集成新服务(如微信、钉钉)。
Webhook
通过 HTTP 请求调用外部 API。
无需编写脚本,配置简单(如集成 Slack、PagerDuty)。
插件(Zabbix Agent Plugin)
开发自定义插件扩展 Zabbix Agent 功能。
适合复杂场景(如需要持续监控的服务)。
二、自定义脚本示例:集成微信企业号
以下是通过 Python 脚本集成微信企业号的完整实现:
1. 准备工作
在企业微信后台创建应用,获取:
CorpID(企业 ID)
AgentID(应用 ID)
Secret(应用密钥)
2. 编写脚本
python
运行
#!/usr/bin/env python3
# 文件:/usr/lib/zabbix/alertscripts/wechat.py
import requests
import json
import sys
import logging
# 配置日志
logging.basicConfig(
filename='/var/log/zabbix/wechat.log',
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
# 企业微信配置
CORP_ID = "your_corp_id"
AGENT_ID = "your_agent_id"
SECRET = "your_secret"
TOKEN_FILE = "/tmp/wechat_token.txt"
def get_access_token():
"""获取企业微信访问令牌,缓存到文件避免频繁请求"""
try:
# 尝试读取缓存的token
with open(TOKEN_FILE, 'r') as f:
token_data = json.load(f)
# 检查token是否过期(有效期7200秒)
if token_data['expire_time'] > time.time():
return token_data['access_token']
except (FileNotFoundError, json.JSONDecodeError, KeyError):
pass
# 重新获取token
url = f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORP_ID}&corpsecret={SECRET}"
response = requests.get(url)
result = response.json()
if result.get('errcode') == 0:
token = result['access_token']
# 缓存token到文件
with open(TOKEN_FILE, 'w') as f:
json.dump({
'access_token': token,
'expire_time': time.time() + 7000 # 提前200秒过期
}, f)
return token
else:
logging.error(f"获取token失败: {result}")
return None
def send_message(access_token, to_user, subject, content):
"""发送消息到企业微信"""
if not access_token:
return False
url = f"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}"
data = {
"touser": to_user,
"msgtype": "text",
"agentid": AGENT_ID,
"text": {
"content": f"【{subject}】\n\n{content}"
}
}
response = requests.post(url, data=json.dumps(data))
result = response.json()
if result.get('errcode') == 0:
logging.info(f"消息发送成功: 接收人={to_user}, 主题={subject}")
return True
else:
logging.error(f"消息发送失败: {result}")
return False
if __name__ == "__main__":
try:
# 接收Zabbix传递的参数
to_user = sys.argv[1] # 接收人(企业微信账号)
subject = sys.argv[2] # 告警主题
content = sys.argv[3] # 告警内容
# 获取token并发送消息
token = get_access_token()
if token:
send_message(token, to_user, subject, content)
else:
logging.error("无法获取访问令牌")
except Exception as e:
logging.exception(f"脚本执行异常: {str(e)}")
3. 配置 Zabbix 媒体类型
路径:管理 → 媒体类型 → 创建媒体类型
参数:
名称:微信企业号
类型:脚本
脚本名称:wechat.py
脚本参数:
plaintext
{ALERT.SENDTO} # 接收人
{ALERT.SUBJECT} # 主题
{ALERT.MESSAGE} # 内容
4. 关联用户与媒体类型
路径:管理 → 用户 → 选择用户 → 媒体 → 添加
参数:
类型:选择刚创建的 “微信企业号”
收件人:填写企业微信账号(如zhangsan)
三、Webhook 示例:集成钉钉机器人
通过 Webhook 集成钉钉无需编写脚本,直接配置 HTTP 请求:
在钉钉群中添加自定义机器人,获取 Webhook URL(如:
https://oapi.dingtalk.com/robot/send?access_token=your_token)
在 Zabbix 中创建 Webhook 媒体类型:
路径:管理 → 媒体类型 → 创建媒体类型
参数:
plaintext
名称:钉钉机器人
类型:Webhook
URL:https://oapi.dingtalk.com/robot/send?access_token=your_token
HTTP方法:POST
标头:Content-Type: application/json
脚本:
{
"msgtype": "text",
"text": {
"content": "{ALERT.SUBJECT}\n\n{ALERT.MESSAGE}"
}
}
四、自定义媒体类型的权限与安全
脚本权限:
确保脚本可执行:chmod +x /usr/lib/zabbix/alertscripts/wechat.py
脚本文件所有权归 Zabbix 用户:chown zabbix:zabbix wechat.py
敏感信息保护:
避免在脚本中硬编码密钥,可通过环境变量或配置文件读取:
python
运行
import os
SECRET = os.environ.get('WECHAT_SECRET')
日志审计:
在脚本中添加详细日志,便于排查问题(如本文示例中的logging模块)。
五、验证自定义媒体类型
测试发送:
在媒体类型配置页面,点击 “测试” 按钮,输入测试参数。
检查目标渠道(微信 / 钉钉)是否收到消息。
查看日志:
检查脚本日志(如/var/log/zabbix/wechat.log)确认执行情况。
触发告警验证:
创建临时触发器,设置低阈值触发告警,验证通知是否正常发送。
通过自定义媒体类型,Zabbix 可无缝集成任何第三方服务,满足企业多样化的告警需求。
- 如何在Zabbix中编写自定义脚本?
2025-07-14
- 除了内置媒体类型,Zabbix还支持···
2025-07-14
- Zabbix的动作配置中,支持哪些类···
2025-07-14
- 如何配置Zabbix的动作,以便在执···
2025-07-12
- 如何在Zabbix中配置执行脚本的操···
2025-07-12
- 如何根据资源异常情况进行自动化···
2025-07-12
- 面向未来的高可用境外服务器架构···
2024-08-26
- 跨境电商成功案例之优秀外国服务···
2024-08-22
- 从成本效益角度分析境外服务器的···
2024-08-17
- 如何规避使用外国服务器的风险问···
2024-08-16
- 搭建安全稳定的境外网站:首选外···
2024-08-19
- 针对中小企业的境外服务器配置指···
2024-08-22