一、机缘

2021 年 11 月,我在 CSDN 注册了账号。那时候写的东西很杂,有 JetBrains IDE 接入 DeepSeek 的教程,有 OpenWebUI 源码部署的踩坑记录,也有 AnythingLLM 接入硅基流动的配置笔记。

那时候我更像是一个"工具配置记录员"——哪个工具火,就试着部署一下,把过程写下来。

真正的转折发生在去年。

我在一个 AIOps 项目里负责日志告警分析模块。需求听起来不复杂:让大模型从运维日志里提取服务名、日志级别、错误码,然后自动查询 ELK、Zabbix,生成一份告警报告。

我一开始走的路很简单:调 OpenAI API,写一段 prompt,把日志文本塞进去,解析返回结果。

但很快发现这条路走不通:

  • 输出格式不稳定,今天是 JSON,明天是 markdown
  • 日志一复杂,模型就开始 hallucination,编出一些不存在的字段
  • 想接 Zabbix、Jenkins、JumpServer 这些系统时,代码越写越乱

正是在这个节点上,我开始认真理解 MCP(Model Context Protocol)LangChain 这些东西。不是为了追热点,是因为手里的 AIOps 项目真的需要把大模型和运维系统连接起来。

从那以后,我的博客定位慢慢清晰了:一个运维开发者,记录自己怎么把 AI 落地到运维场景里。


二、收获

写到现在,我的博客有 32 篇原创文章,520 个点赞,378 个收藏,222 个粉丝,总排名 25911。

数据不算亮眼,但对我自己来说,这几件事很有价值:

1. 有了自己的知识库

我建了几个专栏:

  • AIOps 实战笔记(7 篇,7403 阅读,128 收藏):核心专栏,记录 Dify + ELK/Zabbix/Jenkins/JumpServer 的实战架构
  • LLM 工具与开源(8 篇,11535 阅读,74 收藏):dbskiter、K8sSkill、n8n、OpenWebUI 这些工具
  • 运维开发从 0 到 1(6 篇,4789 阅读,59 收藏):K8s、Grafana、Zabbix-MCP 等基础能力
  • 运维人的发展(3 篇):偏思考,比如《上线 AIOps 半年后,告警变多了》《同事离职后,我像个实习生》

现在遇到问题,我第一反应是去翻自己之前的文章。这比查搜索引擎快多了。

2. 写作倒逼我把事情想明白

很多方案,脑子里想的时候觉得行,真要写成文章给别人看,就会发现漏洞。

比如写 Zabbix-MCP 那篇时,我原本以为"只读查询"这个原则很简单,但写到权限控制、审计、自然语言解析这些细节时,才发现要考虑的东西比想象中多。

3. 收到了真实的反馈

有几篇文章下面有朋友留言:

  • “您的工作流设计图能分享吗”
  • “这些功能具体怎么操作实现的?能写一下吗?付费也行”

这种反馈让我意识到,写的东西真的有人在看、有人想用。这比点赞数字更让我有动力。


三、日常

我的主业是运维开发,白天处理告警、写脚本、维护 AIOps 平台。学习和写博客主要靠晚上和周末。

我的创作节奏很朴素:

  • 工作日晚上:如果当天解决了某个具体问题,就把关键代码和报错记下来
  • 周末:集中整理成文章,补架构图和总结
  • 不追热点:只写自己真实做过、真实踩过坑的东西

平衡创作和工作的秘诀只有一个:写作不是额外任务,而是学习过程的一部分。 我不为了发文而学习,我因为学习而记录。


四、成就

过去这一年,我觉得自己做得最扎实的一件事,是慢慢搭起了一套 AIOps 的 MCP 工具生态

  • ELK-MCP:让大模型通过自然语言查询 Elasticsearch 日志
  • Zabbix-MCP:告警数据的只读查询中台
  • Grafana Query MCP:把自然语言转成 Prometheus/Grafana 查询
  • dbskiter:开源的数据库运维 CLI 工具集
  • K8sSkill:基于自然语言的 Kubernetes 诊断工具

这些工具都有一个共同特点:不是 demo,是为了解决真实运维场景里的具体问题。

下面这段代码,是我觉得最能代表这一年思路的片段——一个简单的 MCP 工具查询入口,体现了"只读、受控、可审计"的设计原则:

"""
文件功能:MCP 工具查询入口示例
主要类/函数:MCPQueryHandler
"""

from typing import Dict, Any


class MCPQueryHandler:
    """
    MCP 工具统一查询处理器
    
    设计原则:
    1. 只读:禁止任何写入、删除、修改操作
    2. 受控:所有查询必须带用户身份和权限范围
    3. 可审计:每次查询记录日志,便于回溯
    """

    def __init__(self, user: str, allowed_indices: list):
        self.user = user
        self.allowed_indices = allowed_indices
        self.audit_log = []

    def query(self, tool_name: str, params: Dict[str, Any]) -> Dict[str, Any]:
        """执行一次受控的 MCP 查询"""
        # 1. 记录审计日志
        self.audit_log.append({
            "user": self.user,
            "tool": tool_name,
            "params": params,
        })

        # 2. 根据工具名分发
        if tool_name == "elk_search":
            return self._query_elk(params)
        elif tool_name == "zabbix_alert":
            return self._query_zabbix(params)
        else:
            return {"error": f"未授权的工具: {tool_name}"}

    def _query_elk(self, params: Dict[str, Any]) -> Dict[str, Any]:
        """查询 ELK 日志"""
        index = params.get("index")
        if index not in self.allowed_indices:
            return {"error": "无权限访问该索引"}
        
        # 实际项目中这里调用 Elasticsearch 客户端
        return {
            "tool": "elk_search",
            "index": index,
            "total": 3,
            "logs": ["..."],
        }

    def _query_zabbix(self, params: Dict[str, Any]) -> Dict[str, Any]:
        """查询 Zabbix 告警"""
        return {
            "tool": "zabbix_alert",
            "host": params.get("host"),
            "alerts": ["..."],
        }

这段代码不复杂,但它体现了我过去一年最核心的转变:从"调用大模型 API"到"搭建可落地的 AIOps 工具链"。


五、憧憬

接下来几个月,我有几个明确的计划:

  1. 深入学习 LangGraph:不只是 LangChain,而是把状态管理、持久化、多 Agent 协作这些概念补全
  2. 扩展 MCP 生态:把更多运维系统(比如 Prometheus、Nacos、Jenkins)通过 MCP 接入大模型
  3. 把 dbskiter 做扎实:从数据库运维 CLI 工具,往智能化诊断方向再进一步
  4. 继续写真实笔记:不写空泛的教程,只记录真实项目里的选择和取舍

运维这条路做了五年,我越来越觉得:技术的价值,不在于它有多新,而在于它能帮上多少忙。

写博客也是如此。如果我的文章能让另一个运维开发者在凌晨两点的告警群里少踩一个坑,那这些文字就是有意义的。

继续写下去。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐