ARTICLE · 1243602
一切皆插件:基于 DeepSeek Harness 与 ES MCP 的智能化日志排障实战
01
ARCHITECTURE
核心思路与架构
DeepSeek Harness 和市面上大多数智能体不太一样。别人是“我帮你把活儿干了”,它是“我把所有可能性都交给你”。核心就四个字:一切皆插件。模型、工具、会话日志,甚至 agent 循环本身,全是插件。你想接哪个模型、挂哪个工具,全由自己拼。
对运维来说,最值钱的是这句话的延伸:MCP 服务器,也是插件。这意味着 Ansible、Zabbix、K8s 这些现成工具,可以一个个“插”进去,让它变成你的智能运维中枢。今天,我们就拿最实在的场景开刀——用 Dsh 做日志分析。

02
ARCHITECTURE
部署和使用
部署与访问:Linux 起服务,Windows 连 SSH
先说环境。Dsh 我是部署在 Linux 服务器(10.100.80.84)上的,启动后它默认只监听本地 127.0.0.1:3080。
我平时用 Windows 办公,怎么访问?千万别去改 Dsh 的监听地址暴露到公网。最安全、最简单的姿势是用 SSH 本地端口转发。在 Windows 的终端(比如 PowerShell 或 CMD)里敲:
ssh -N -L 3081:127.0.0.1:3080 ops@10.100.80.84这条命令的意思是:把本地的 3081 端口,通过 SSH 隧道映射到 Linux 服务器的 127.0.0.1:3080。敲完输入密码,保持这个窗口别关,然后你在 Windows 浏览器里访问 http://127.0.0.1:3081,就能打开 Dsh 的 Web 界面了。简单强调一下:Dsh 的 Web 端千万别直接暴露公网,用 SSH 隧道既安全又省事。
Elasticsearch MCP:把日志库变成“工具”
搞日志分析绕不开 Elasticsearch。Elastic 官方出了一个 MCP Server 镜像,把 ES 的常用操作封装成了模型能直接调用的工具。配置好之后,你在 Dsh 里问一句“有哪些 ES 工具?”,它直接甩你一张表,包含 list_indices(看索引)、get_mappings(看映射)、search(跑 DSL)、esql(跑 ES|QL 查询)和 get_shards(看分片)。这 5 个工具,基本把日常排障的活儿包圆了。
部署它其实就是一条 docker-compose.yml 的事。直接抄我这份:
services:mcp-elasticsearch:image: docker.elastic.co/mcp/elasticsearch:latestcontainer_name: mcp-elasticsearch-httpports:- "8080:8080"environment:# ✅ ES 连接地址- ES_URL=http://10.100.80.62:9200# ✅ Basic Auth 认证(注意变量名必须是 ES_USERNAME,不是 ES_USER)- ES_USERNAME=elastic- ES_PASSWORD=kddexgty# ✅ 如果 ES 没有配置有效 SSL 证书,建议加上此项避免连接失败- ES_SSL_SKIP_VERIFY=truecommand: ["http"]restart: unless-stopped
有几个细节得留意:认证方式用的是基础认证,所以变量名必须是 ES_USERNAME 和 ES_PASSWORD,别写成 ES_USER,不认的;ES_SSL_SKIP_VERIFY=true 是为了跳过自签名证书的验证,如果你 ES 配了受信任的证书可以不加;command: ["http"] 是告诉它用 HTTP 模式跑,默认端口 8080。
跑起来之后,你的日志库就“插件化”了一半——它有了个模型能听懂、能调用的接口。
dsh-mcp-client:把外部工具接进 Dsh
MCP 服务跑起来后,Dsh 本身是不知道的。这时候就需要 dsh-mcp-client 这个桥接插件。它的作用很纯粹:让模型使用外部 MCP 服务器的工具与资源。
安装这里有个坑。如果你直接敲:
dsh plugin --profile web add @deepseek-ai/dsh-mcp-client可能会报错,提示不兼容。官方 npm 仓库中该包的 latest 标签指向存在滞后,仍停留在早期版本。不加版本号时,包管理器会按照默认的 latest 标签解析,从而拉取到旧版依赖,最终因不满足当前 Dsh 运行时的 peer 依赖要求,被插件的兼容性门禁直接拦截。
所以有遇到不兼容的错误,加上显式锁定版本号:
dsh plugin --profile web add @deepseek-ai/dsh-mcp-client@0.2.1-rc.2安装完之后,Dsh 并不会自动挂载它。你得手动在 cordis.patch.yml 里写一条配置,告诉它连哪台服务器:
#默认路径是~/.dsh/profiles/web/cordis.patch.yml- id: mcp-elasticsearchname: '@deepseek-ai/dsh-mcp-client'config:serverName: elasticsearchtransport: streamable-httpurl: http://10.100.80.62:8080/mcp
几个关键字段:serverName 必填,是工具名称的 namespace,规则是 [A-Za-z0-9_-]{1,32};transport 填 streamable-http,对应我们的 HTTP 模式。
官方文档里有个点值得注意:工具名会自动带上服务器前缀。模型看到的不是裸的 search,而是 mcp__elasticsearch__search。这样两个服务器可以同时提供名为 search 的工具,分别以 mcp__github__search 和 mcp__web__search 共存,不会打架。
保存配置,重启 dsh web,新建会话,问模型“列出与 elasticsearch 相关的工具”。只要它能把上面那张表里的工具报给你,链路就通了。
实战演练:一句话搞定日志排障
链路打通后,直接进入实战。以前线上报警查日志,得开 Kibana 拼 DSL、对时间,费时费力。现在只需一句话派活儿:
“查一下最近一小时 error 级别的日志,按服务名聚合,看看哪个服务报错最多。”


你不需要操心它先调 list_indices 还是 search,模型会自己规划执行路径,查完直接把结果汇总给你。想深挖,接着追问趋势即可。
这里提个醒:在智能体排障时,Dsh 的「轨迹」功能很实用。模型的推理过程、工具调用、请求参数和报错信息都能清晰查看。遇到卡顿时,也能快速定位是模型推理慢、MCP 响应超时,还是返回数据过多,方便及时调整。
貌似 ES MCP 的 list_indices 存在解码问题,所以暂时用 * 通配符配合字段过滤查询,service 字段直接用于聚合。另外,我在开发 AIOps 智能体时也自己写了一个 ES MCP,目前代码还没整理好,这几天整理完会上传到 GitHub,感兴趣的可以关注一下。
为什么这条路值得跟
这次折腾下来,Dsh 确实还没到“把运维全托管”的地步。但它那套“一切皆插件”的玩法,确实给 AIOps 指了条明路:核心能力不再被厂商锁死,而是握在自己手里。
下面的课程作者是阿铭,《跟阿铭学 Linux》作者,曾就职于腾讯,有近 20 年 IT 从业经验,现全职从事 IT 职业培训,方向包括运维、K8s 和大模型。
更多文章请扫一扫
扫描下面二维码关注公众号,获取更多学习资源















































































