RELATEED CONSULTING
相关咨询
欢迎选择下列在线客服咨询
微信客服
微信客服二维码
热线电话:13863516421
7x24小时,全年无休
我们服务器的承诺:
关闭右侧工具栏

境外国外服务器专题

除了内置媒体类型,Zabbix还支持自定义媒体类型吗?

  • 来源:本站
  • 编辑: 超级管理员
  • 时间:2025-07-14 10:20:20
  • 阅读0次

是的,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 可无缝集成任何第三方服务,满足企业多样化的告警需求。


我们提供7X24小时售后服务,了解更多机房产品和服务,敬请联系
购买咨询 售后服务