zabbix报警结合AI进行智能分析
zabbix报警结合AI进行智能分析
- 一、功能介绍
- 二、实现流程
- 1、登录kimi api获取api key
- 2、安装openssl1.1.1版本
- 2.1 安装openssl 1.1.1
- 2.2 查看openssl版本
- 3、编译安装python-3.12
- 3.1 安装python3
- 3.2 测试正常加载ssl模块
- 4、配置国内pip仓库
- 5、安装python脚本需要的requests库
- 6、编写python脚本
- 7、将脚本复制到zabbix路径
- 8、返回zabbix web前端进行报警配置
- 8.1 创建报警媒介
- 8.2 在Admin用户关联报警媒介
- 8.3 创建报警动作
- 9、测试验证
一、功能介绍
为了协助运维人员加速故障处理修复问题,在配置zabbix报警时,可以通过以脚本的方式调用AI api(本案例中采用的是调用kimi api的方式,尝试调用过deepseek,由于deepseek经常出现服务器繁忙, 经常会出现zabbix调用脚本超时的问题)将zabbix报警信息发送到AI进行智能分析,分析过后,将AI智能分析结果以邮件的方式发送到运维人员处,可协助运维人员快速定位故障。
二、实现流程
1、登录kimi api获取api key
https://platform.moonshot.cn
2、安装openssl1.1.1版本
由于centos7.9系统自带的openssl为1.0版本,后续调用kimi api时,需要python中加载1.1.1版本的openssl
2.1 安装openssl 1.1.1
[root@localhost ~]# yum -y groupinstall "Development Tools"
[root@localhost ~]# yum -y install wget zlib-devel perl-core
[root@localhost ~]# wget https://www.openssl.org/source/openssl-1.1.1t.tar.gz
[root@localhost ~]# tar xf openssl-1.1.1t.tar.gz
[root@localhost ~]# cd openssl-1.1.1t/
[root@localhost ~]# ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
[root@localhost ~]# make
[root@localhost ~]# make install
[root@localhost ~]# vim /etc/profile
export PATH=$PATH:/usr/local/openssl/bin
export LD_LIBRARY_PATH=/usr/local/openssl/lib:$LD_LIBRARY_PATH
[root@localhost ~]# source /etc/profile
[root@localhost ~]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/openssl/lib
[root@localhost ~]# ldconfig
2.2 查看openssl版本
[root@localhost shell_gpt]# openssl version
OpenSSL 1.1.1t 7 Feb 2023
3、编译安装python-3.12
注意:安装python3时需要注意加载openssl模块
3.1 安装python3
[root@localhost shell_gpt]# yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
[root@localhost shell_gpt]# tar xf Python-3.12.8.tar.xz
[root@localhost shell_gpt]# cd Python-3.12.8/
[root@localhost shell_gpt]# ./configure --prefix=/usr/local/python3 --with-openssl=/usr/local/openssl
[root@localhost shell_gpt]# make
[root@localhost shell_gpt]# make install
[root@localhost ~]# vim /etc/profile
export PATH=$PATH:/usr/local/python3/bin
[root@localhost ~]# source /etc/profile
[root@localhost ~]# python3 --version
Python 3.12.8
3.2 测试正常加载ssl模块
[root@localhost ~]# python3
Python 3.12.8 (main, Mar 11 2025, 17:59:42) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
>>> exit()
[root@localhost ~]#
4、配置国内pip仓库
[root@localhost ~]# cat /root/.pip/pip.conf
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
5、安装python脚本需要的requests库
[root@localhost ~]# pip3 install requests
6、编写python脚本
#!/usr/local/python3/bin/python3
import sys
import json
import requests
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from typing import Tuple
# ========== 配置区 ==========
KIMI_API_URL = "https://api.moonshot.cn/v1/chat/completions" # Kimi API端点
KIMI_API_KEY = "kimi api kkey" # 平台获取的API密钥
QQ_SMTP = ('smtp.qq.com', 465) # SSL端口
SENDER = '发送邮箱' # 发件邮箱
AUTH_CODE = '邮箱授权码' # QQ邮箱授权码
RECEIVER = '接收邮箱' # 收件邮箱
def parse_zabbix_args() -> Tuple[str, str]:
"""解析Zabbix传入参数"""
if len(sys.argv) < 3:
raise ValueError("参数格式错误,正确格式:脚本名 '报警标题' '报警内容'")
return sys.argv[1], sys.argv[2]
def kimi_analysis(alert_msg: str) -> str:
"""调用Kimi进行智能分析"""
headers = {
"Authorization": f"Bearer {KIMI_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": "moonshot-v1-8k",
"temperature": 0.3, # 控制回答随机性
"messages": [
{
"role": "system",
"content": "作为资深运维工程师,请分析以下Zabbix告警(需包含:1.故障定位 2.可能原因 3.处理建议)"
},
{"role": "user", "content": alert_msg}
]
}
try:
resp = requests.post(KIMI_API_URL, headers=headers, json=payload, timeout=30)
resp.raise_for_status()
return resp.json()['choices'][0]['message']['content']
except requests.exceptions.RequestException as e:
return f"API请求失败:{str(e)}"
except KeyError:
return "解析Kimi响应失败,请检查API格式"
from email.utils import formataddr # 新增导入
def compose_email(alert_subject: str, alert_msg: str, analysis: str) -> MIMEText:
"""构建MIME邮件体(修复From头编码)"""
content = f"""
【Zabbix原始告警】
主题:{alert_subject}
内容:{alert_msg}
【Kimi智能诊断】
{analysis}
"""
msg = MIMEText(content, 'plain', 'utf-8')
# 使用 formataddr 正确处理中文显示名称和邮箱地址
msg['From'] = formataddr(('Zabbix监控系统', SENDER)) # 关键修改
msg['To'] = Header(RECEIVER, 'utf-8') # 确保接收方编码正确
msg['Subject'] = Header(f'告警分析报告 - {alert_subject}', 'utf-8')
return msg
def send_email(msg: MIMEText) -> None:
"""改进版邮件发送(显式管理连接)"""
server = smtplib.SMTP_SSL(*QQ_SMTP)
server.set_debuglevel(0) # 调试时开启
try:
server.login(SENDER, AUTH_CODE)
server.sendmail(SENDER, RECEIVER, msg.as_string())
print("邮件发送成功", flush=True)
except smtplib.SMTPException as e:
print(f"邮件发送失败:{str(e)}", flush=True)
finally:
try:
server.quit() # 优雅退出
except:
server.close() # 强制关闭连接
return
if __name__ == "__main__":
# 步骤1:获取Zabbix参数
subject, message = parse_zabbix_args()
# 步骤2:调用Kimi分析
analysis = kimi_analysis(message)
# 步骤3:构造并发送邮件
email_msg = compose_email(subject, message, analysis)
send_email(email_msg)
7、将脚本复制到zabbix路径
[root@localhost ~]# cp test.py /usr/lib/zabbix/alertscripts/send_to_kimi.py
[root@localhost ~]# chmod 755 /usr/lib/zabbix/alertscripts/send_to_kimi.py
[root@localhost ~]# chown zabbix.zabbix /usr/lib/zabbix/alertscripts/send_to_kimi.py
[root@localhost ~]# ls -l /usr/lib/zabbix/alertscripts/send_to_kimi.py
-rwxr-xr-x 1 zabbix zabbix 3568 Mar 12 10:10 /usr/lib/zabbix/alertscripts/send_to_kimi.py
8、返回zabbix web前端进行报警配置
8.1 创建报警媒介
8.2 在Admin用户关联报警媒介
8.3 创建报警动作
9、测试验证
关闭被监控机的服务,测试报警
打开邮箱查看