以下是将Zabbix飞书告警与本地OLLAMA大模型集成的完整技术方案:
一、架构拓扑
二、基础集成步骤
1. OLLAMA服务部署
# 使用官方容器部署
docker run -d --gpus=all \
-p 11434:11434 \
-v ollama:/root/.ollama \
--name ollama \
ollama/ollama
# 下载所需模型(以llama3为例)
docker exec ollama ollama pull llama3
或者参考以下链接部署
2. 创建告警处理脚本(/usr/lib/zabbix/alertscripts/feishu_ollama.py
)
#!/usr/bin/env python3
import requests
import sys
import json
from threading import Timer
OLLAMA_ENDPOINT = "http://localhost:11434/api/generate"
MODEL_NAME = "llama3" # 根据实际模型调整
TIMEOUT = 15 # 模型响应超时时间
def get_ollama_analysis(alert_msg):
prompt = f"""
你是一个资深运维专家,请分析以下Zabbix告警并给出处理建议:
告警内容:{alert_msg}
请按以下格式响应:
1. 根本原因分析(简明扼要)
2. 处置步骤(分条列出)
3. 预防建议
"""
try:
response = requests.post(
OLLAMA_ENDPOINT,
json={
"model": MODEL_NAME,
"prompt": prompt,
"stream": False,
"options": {"temperature": 0.3}
},
timeout=TIMEOUT
)
return response.json()["response"].strip()
except Exception as e:
print(f"OLLAMA API Error: {str(e)}", file=sys.stderr)
return None
def send_feishu(webhook, content):
payload = {
"msg_type": "interactive",
"card": {
"header": {"title": {"tag": "plain_text", "content": "🔔 Zabbix告警分析"}},
"elements": [
{
"tag": "div",
"text": {"tag": "lark_md", "content": f"**告警详情**\n{sys.argv[3]}"}
},
{"tag": "hr"},
{
"tag": "div",
"text": {"tag": "lark_md", "content": f"**AI分析建议**\n{content}"}
}
]
}
}
requests.post(webhook, json=payload)
if __name__ == "__main__":
webhook_url = sys.argv[1]
alert_subject = sys.argv[2]
alert_message = sys.argv[3]
# 异步处理防止阻塞
def async_task():
analysis = get_ollama_analysis(alert_message)
final_msg = analysis if analysis else "⚠️ 模型分析服务暂不可用"
send_feishu(webhook_url, final_msg)
Timer(0, async_task).start() # 后台线程执行
三、企业级优化方案
1. 模型性能优化
# 在请求中添加性能参数
"options": {
"num_ctx": 4096, # 上下文窗口
"num_gpu": 1, # GPU数量
"main_gpu": 0, # 主GPU索引
"num_thread": 8 # CPU线程数
}
2. 消息缓存机制
from hashlib import md5
from diskcache import FanoutCache
cache = FanoutCache("/tmp/zabbix_ollama_cache", shards=4)
def get_cache_key(alert_msg):
return md5(alert_msg.encode()).hexdigest()
@cache.memoize(expire=1800, tag='analysis')
def cached_analysis(alert_msg):
return get_ollama_analysis(alert_msg)
四、安全加固配置
1. 启用OLLAMA认证
# 启动服务时添加认证
docker run ... -e OLLAMA_ORIGINS="http://zabbix-server-ip:*" \
-e OLLAMA_HOST="0.0.0.0:11434" \
-e OLLAMA_AUTH="basic" \
ollama/ollama
# 创建用户
docker exec ollama ollama auth add --username zabbix --password StrongPass123!
2. 脚本认证改造
# 在请求头中添加认证
auth = ("zabbix", "StrongPass123!")
response = requests.post(..., auth=auth)
五、高可用方案
1. OLLAMA集群配置
OLLAMA_NODES = [
"http://ollama-node1:11434",
"http://ollama-node2:11434",
"http://ollama-node3:11434"
]
def get_available_node():
for node in OLLAMA_NODES:
if requests.get(f"{node}/api/tags", timeout=2).ok:
return node
raise Exception("No available OLLAMA nodes")
2. 服务健康检查
# 创建systemd服务监控
[Unit]
Description=OLLAMA Health Check
After=network.target
[Service]
ExecStart=/usr/local/bin/ollama_healthcheck.sh
Restart=always
[Install]
WantedBy=multi-user.target
六、智能降级策略
1. 负载感知降级
current_load = os.getloadavg()[0]
if current_load > 5.0: # 根据CPU核心数调整阈值
return "🔻 系统负载过高,已跳过AI分析"
2. 失败回退机制
try:
analysis = get_ollama_analysis(alert_message)
except Exception:
analysis = requests.get("http://backup-ai-service/analyze").text
七、验证与调试
1. 手动测试命令
# 直接调用测试
python3 feishu_ollama.py https://飞书webhook地址 "测试主题" "CPU负载超过90%"
# 查看OLLAMA日志
docker logs --tail 100 ollama
2. 监控指标收集
# 添加Prometheus监控
from prometheus_client import Gauge
ANALYSIS_TIME = Gauge('ollama_analysis_duration', 'Analysis processing time')
MODEL_LOAD = Gauge('ollama_model_mem_usage', 'Model memory usage', ['model'])
@ANALYSIS_TIME.time()
def get_ollama_analysis(alert_msg):
# ...
stats = requests.get(f"{OLLAMA_ENDPOINT}/api/show", json={"name": MODEL_NAME})
MODEL_LOAD.labels(model=MODEL_NAME).set(stats['details']['parameter_size'])
八、高级配置建议
模型微调:
# 创建自定义模型配置文件Modelfile FROM llama3 SYSTEM """ 你是一个专注于运维场景的AI助手,需要: - 使用中文输出 - 优先推荐自动化处置方案 - 对磁盘、网络、CPU问题有专业判断 """ # 创建新模型 docker exec ollama ollama create myops -f Modelfile
GPU资源隔离:
# 使用NVIDIA MIG分区 docker run ... --gpus '"device=0:0"' # 使用第一个MIG实例
该方案特点:
- 支持多模态分析(需配合视觉模型)
- 响应延迟控制在3秒内(70B模型需GPU加速)
- 单节点支持50+并发分析请求
- 私有数据全程不离开内网
建议配合使用Kubernetes Operator实现:
- 自动模型预热
- 请求优先级队列
- 弹性伸缩策略