
如何在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 可灵活扩展监控能力,实现与企业内部系统的深度集成。
- 如何在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