以下是将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'])

八、高级配置建议

  1. 模型微调

    # 创建自定义模型配置文件Modelfile
    FROM llama3
    SYSTEM """
    你是一个专注于运维场景的AI助手,需要:
    - 使用中文输出
    - 优先推荐自动化处置方案
    - 对磁盘、网络、CPU问题有专业判断
    """
    
    # 创建新模型
    docker exec ollama ollama create myops -f Modelfile
    
  2. GPU资源隔离

    # 使用NVIDIA MIG分区
    docker run ... --gpus '"device=0:0"'  # 使用第一个MIG实例
    

该方案特点:

  • 支持多模态分析(需配合视觉模型)
  • 响应延迟控制在3秒内(70B模型需GPU加速)
  • 单节点支持50+并发分析请求
  • 私有数据全程不离开内网

建议配合使用Kubernetes Operator实现:

  • 自动模型预热
  • 请求优先级队列
  • 弹性伸缩策略
Copyright © https://yan-jian.com 2023 all right reserved更新时间: 2025-03-12 09:05:27

results matching ""

    No results matching ""