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

境外国外服务器专题

如何在Zabbix中编写自定义脚本?

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


在 Zabbix 中编写自定义脚本主要用于扩展监控功能、自动化处理问题或实现特殊告警逻辑。以下是详细的编写方法和最佳实践:

一、脚本基础配置

存放路径

默认路径:/usr/lib/zabbix/externalscripts/(需确保 Zabbix 用户有读写权限)

可通过zabbix_server.conf中的ExternalScripts参数修改路径。

权限设置

bash

chmod +x /usr/lib/zabbix/externalscripts/your_script.sh  # 添加执行权限

chown zabbix:zabbix /usr/lib/zabbix/externalscripts/your_script.sh  # 归属Zabbix用户


二、脚本类型与场景

1. 监控脚本(获取自定义指标)

场景:监控数据库连接数、应用特定指标等。

示例:监控 MySQL 慢查询数量(Python)

python

运行

#!/usr/bin/env python3

import subprocess


def get_slow_queries():

    result = subprocess.run(

        ["mysqladmin", "-uuser", "-ppassword", "extended-status", "|", "grep", "Slow_queries"],

        capture_output=True,

        text=True

    )

    return result.stdout.strip().split()[1]


print(get_slow_queries())


2. 自动化处理脚本(修复问题)

场景:自动清理日志、重启服务等。

示例:清理 Tomcat 日志(Shell)

bash

#!/bin/bash

LOG_DIR="/var/log/tomcat"

find "$LOG_DIR" -name "*.log" -mtime +7 -delete

echo "Cleaned logs at $(date)" >> /var/log/zabbix/tomcat_clean.log


3. 告警脚本(自定义通知方式)

场景:集成微信、钉钉等第三方通知渠道。

示例:发送钉钉告警(Shell)

bash

#!/bin/bash

WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=your_token"

MSG=$(cat <<EOF

{

    "msgtype": "text",

    "text": {

        "content": "告警: $1\n\n详情: $2"

    }

}

EOF

)

curl -H "Content-Type: application/json" -X POST -d "$MSG" "$WEBHOOK"


三、脚本参数与宏

Zabbix 支持在调用脚本时传递宏参数,常用宏:


{HOST.NAME}:主机名

{ITEM.VALUE}:监控项值

{TRIGGER.NAME}:触发器名称

{EVENT.DATE}:事件日期


示例:在动作中调用脚本并传递参数


bash

# 脚本接收3个参数:主机名、触发器名、监控值

/usr/lib/zabbix/externalscripts/alert_handler.sh "{HOST.NAME}" "{TRIGGER.NAME}" "{ITEM.VALUE}"

四、脚本执行与错误处理

日志记录

使用标准日志文件(如/var/log/zabbix/script_name.log)记录执行过程。

python

运行

import logging

logging.basicConfig(

    filename='/var/log/zabbix/script.log',

    level=logging.INFO,

    format='%(asctime)s - %(levelname)s - %(message)s'

)


错误处理

使用try-except(Python)或set -e(Shell)捕获异常。

python

运行

try:

    # 主逻辑

except Exception as e:

    logging.error(f"脚本执行失败: {str(e)}")

    exit(1)  # 返回非零退出码表示失败


返回值

通过exit code向 Zabbix 反馈执行结果(0 表示成功,非 0 表示失败)。

bash

# Shell脚本返回错误示例

if ! command; then

    echo "操作失败" >&2

    exit 1

fi


五、安全与权限最佳实践

最小权限原则

避免脚本以 root 权限运行,可通过sudo配置特定命令权限:

plaintext

# /etc/sudoers.d/zabbix

zabbix ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart tomcat


敏感信息保护

避免在脚本中硬编码密码,使用环境变量或配置文件:

python

运行

import os

DB_PASSWORD = os.environ.get('DB_PASSWORD')


输入验证

对接收的参数进行合法性检查,防止命令注入:

python

运行

import re

if not re.match(r'^[a-zA-Z0-9_.-]+$', host_name):

    raise ValueError("非法主机名")


六、调试与测试

手动执行测试

bash

# 模拟Zabbix调用,传递参数

/usr/lib/zabbix/externalscripts/your_script.sh "test_host" "High CPU" "95%"


查看 Zabbix 日志

bash

tail -f /var/log/zabbix/zabbix_server.log | grep "Execute script"


单元测试

为复杂脚本编写测试用例(如 Python 的unittest模块):

python

运行

import unittest


class TestScript(unittest.TestCase):

    def test_parse_output(self):

        self.assertEqual(parse_output("OK: 10"), 10)


if __name__ == '__main__':

    unittest.main()


七、示例:完整的自定义监控脚本

以下是一个监控 Redis 内存使用的脚本,返回内存使用率百分比:


python

运行

#!/usr/bin/env python3

import subprocess

import re

import sys

import logging


logging.basicConfig(

    filename='/var/log/zabbix/redis_monitor.log',

    level=logging.INFO,

    format='%(asctime)s - %(levelname)s - %(message)s'

)


def get_redis_memory(host='localhost', port=6379, password=None):

    try:

        # 构建redis-cli命令

        cmd = ['redis-cli', '-h', host, '-p', str(port)]

        if password:

            cmd.extend(['-a', password])

        cmd.append('INFO')

        

        # 执行命令并获取输出

        result = subprocess.run(

            cmd,

            capture_output=True,

            text=True,

            check=True

        )

        

        # 解析内存使用信息

        for line in result.stdout.split('\n'):

            if line.startswith('used_memory:'):

                used = int(line.split(':')[1])

            elif line.startswith('maxmemory:'):

                max_mem = int(line.split(':')[1])

        

        # 计算使用率(如果maxmemory为0,表示未限制)

        if max_mem > 0:

            return (used / max_mem) * 100

        else:

            return used / (1024 * 1024)  # 返回MB为单位的使用量

    

    except Exception as e:

        logging.error(f"获取Redis内存失败: {str(e)}")

        sys.exit(1)


if __name__ == '__main__':

    # 支持自定义主机和端口参数

    host = sys.argv[1] if len(sys.argv) > 1 else 'localhost'

    port = int(sys.argv[2]) if len(sys.argv) > 2 else 6379

    

    memory_usage = get_redis_memory(host, port)

    print(f"{memory_usage:.2f}%")



通过自定义脚本,Zabbix 可灵活扩展监控能力,实现与企业内部系统的深度集成。


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