文章目录
🍃 作者介绍:25 届网络工程,本科时期主攻 Java 后端,如今做 AI 工程落地。
🦅 个人主页:@逐梦苍穹
📕 所属专栏:人工智能
🌻 Gitee:xzl 的人工智能代码仓库
✈ 觉得有用,记得收藏 + 关注;需要完整工程与模板,评论区留「ENSP」获取。
1、前言
如果你做过网络自动化,大概率踩过这些坑
:脚本一次能跑过,但二次上线就变脆;CLI 回显经常乱码;一遇到复杂变更就要加班写 Playbook。更别说让非网工同事 “看得懂、用得上”。
这篇文章分享一个更自然的解法:把 LLM 的“能理解人话”,和 MCP(Model Context Protocol,模型上下文协议)的“安全工具调用”,接到华为 ENSP 设备上。最终效果:对 AI 说一句话,它会用标准化的“工具”去连设备、执行命令、拿结果、存档留痕。
这套方案来自我的真实项目实践“基于模型上下文协议MCP实现ENSP设备自动化操作”,用更轻松的方式带你从原理走到落地。
读完你将收获:
- 为什么用 MCP 做网络自动化:它把“会话里的工具调用”标准化,安全可控、可扩展。
- 一套可复用的最小实现:三种工具覆盖 80% 日常场景(配置、查询、保存)。
- 从零到一的落地清单:接入、鉴权、编码、容错、可观测,一次性讲清。
2、MCP 是什么,为什么适合网络自动化
MCP 是一种让模型“安全、标准化地”调用外部工具/数据的协议。它解决了 LLM“只能聊天”的局限,把“指令 → 工具调用 → 回显 → 决策”这条链路串成闭环。
- 标准化:工具接口有描述、有约束,谁接谁用都统一。
- 可观测:每次调用与返回都在会话链路中,有迹可循,便于审计与回放。
- 可扩展:新增一个工具不影响其它能力,按需组合。
把 MCP 放进网络自动化,模型就不再“直接下命令”,而是“请求使用某个工具”。你可以对工具做权限、风控、参数校验,风险更可控。
MCP 与一般函数调用的区别
从“函数调用”到“协议化工具调用”,最大的不同在于:
- 调用对象:不再是单一函数,而是受控的工具集合。
- 治理能力:请求/响应全链路可观测,可做审计与回放。
- 扩展性:新增工具不侵入既有能力,按需组合更灵活。
常见调用方式与 MCP 的差异(其一)
常见调用方式与 MCP 的差异(其二)
3、整体架构与数据流
LLM / AI 助手 ⇄ MCP 客户端 ⇄ ensp 服务器(Python) ⇄ SSH(Paramiko) ⇄ 华为设备
- LLM/助手:把自然语言意图转为“调用哪个工具 + 参数”。
- ensp 服务器:用 Python 实现 MCP 端点,真正去连设备、跑命令、处理文件。
- Paramiko:稳定的 SSH 执行通道。
模型上下文协议的核心遵循Client-Server架构(即客户端-服务器架构),其中主机应用程序可以连接到多个MCP服务器,主要架构原理如下图:
MCP 结合 ENSP 的自动化架构设计图
拓扑图总览
跨不同操作系统打通 ENSP 访问与 MCP 总体结合方案
4、三个核心工具:覆盖 80% 场景
- configure-device:批量执行配置命令(如进入 system-view、创建 VLAN、应用 ACL 等)。
- show-device-info:执行查询类命令(如 display version / interface brief)。
- save-to-file:把回显落盘,同时自动识别编码并纠正,避免乱码。
如果调用的工具是configure-device或show-device-info:
5、工程结构与依赖
为了让自动化“跑得稳、能维护”,工程分层清晰、依赖可控是关键:
- 依赖与环境:记录依赖与版本,确保可复现。
- 目录结构:代码与配置分离、工具与业务分离。
- 最小核心:server 初始化、工具注册、调用路由、设备执行。
ensp server 的依赖与版本信息
完整 ensp server 结构
聚焦代码结构的简化视图
6、工具与接口契约
MCP 的强大在于“契约清晰”。以 list_tools 返回的三类工具为例:
- configure-device:配置命令批量下发。
- show-device-info:查询命令执行。
- save-to-file:回显持久化,处理编码。
工具清单的定义与返回结构
配置工具定义
查询工具定义
持久化工具定义
7、调用链路与执行流程
从“意图”到“设备回显”,链路如下:
- 初始化与注册:server 启动并注册工具。
- 调用路由:根据 name 与 arguments 分派。
- 设备执行:通过 SSH 执行命令并收集回显。
- 落盘存证:检测编码、写入文件。
server 初始化与装饰器
handle_call_tool 的路由与参数校验
execute_device_commands 核心逻辑
save-to-file 的保存路径
编码检测与回退策略,保障可读可写
server 主程序入口
8、关键实现要点(也是排坑指南)
8.1 SSH 连接要“耐心+容错”
确保连接超时、密钥禁用、Agent 关闭等细节到位,避免环境差异导致连接失败:
ssh_client.connect(
hostname=ip,
username=username,
password=password,
look_for_keys=False,
timeout=20, # 增加连接超时时间
allow_agent=False
)
最常用的python第三方库是paramiko,利用它来对网络设备进行SSH远程连接,下面是使用paramiko库ssh连接网络设备的示例代码:
8.2 命令执行要“等一等”
网络设备回显不是即时的。适当 sleep 并用 recv_ready() 拉取缓冲,避免丢字:
for cmd in commands:
command_shell.send(f"{cmd}\n")
# 增加等待时间,确保命令执行完成
time.sleep(2)
while command_shell.recv_ready():
output += command_shell.recv(65535).decode("utf-8", errors="ignore")
8.3 回显要“能落盘,还不能乱码”
很多设备回显带有本地化编码。这里用 chardet 检测编码并选择最优写入,必要时回退常见编码:
# 使用 chardet 检测编码
detected = chardet.detect(content_bytes)
encoding = detected['encoding']
confidence = detected['confidence']
if encoding:
try:
# 如果是字节,使用检测到的编码解码
if not isinstance(content, str):
content = content_bytes.decode(encoding)
9、上手实战:5 分钟跑通一条“能说人话”的变更
场景:在 10.0.0.1 上创建 VLAN 10 并命名为 APP,保存查询结果。
- 在聊天里直接说:
- “在 10.0.0.1 上创建 VLAN 10,命名 APP,并展示接口简表,然后把回显保存到桌面。”
- 模型会顺序调用:
- configure-device,参数形如:
{
"ip": "10.0.0.1",
"username": "admin",
"password": "******",
"commands": [
"system-view",
"vlan 10",
"name APP",
"quit",
"save force"
]
}
- show-device-info,参数:{“command”: “display interface brief”, …}
- save-to-file,参数:{“content”: “<回显>”, “file_path”: “~/Desktop/ensp_result.txt”}
就这样,一次自然语言交互完成了配置、校验与归档。
10、多客户端接入与演示(Claude Desktop / Cline)
上层接入决定了体验与推广效率。这里展示两类典型客户端:
Claude Desktop:官方客户端,天然适配 MCP 生态
Claude Desktop 识别到的本地 MCP Tools
调用 configure-device 自动写入设备配置
调用 show-device-info 查询设备信息
调用 save-to-file 将回显持久化到本地文件
一次对话内组合调用多个工具
生成并写入的文件内容
11、Cline 自动纠错与多工具调用演示
以 Cline 为例,展示“失败自纠错、按需复用工具”的端到端过程:
插件识别任务背景
输入的自然语言需求
大模型给出初步计划与工具选择
首次写配置
失败后自动修正命令并重试
查询设备信息核验配置结果
返回有效回显
将回显保存到目标路径
一次端到端调用闭环完成
配置DeepSeek的API接口:
12、常见问题与建议
当找不到对应工具时的返回路径,便于定位参数/权限问题
- 认证失败:确认用户名/密码、设备本地/AAA 策略与 SSH 打开状态。
- SSH 异常:网络不通、算法协商失败、会话上限等因素要逐一排查。
- 回显乱码:优先自动检测;若仍异常,手动尝试 utf-8/gbk/gb2312/utf-16 回退策略。
- 长批量命令:适当提高 sleep,或按逻辑分段下发,避免回显截断。
- 最小权限:为工具账户分配最小化权限与命令白名单,降低误操作风险。
13、和传统脚本/平台相比,优势在哪里?
- 交互更自然:非网工也能“说人话办事”。
- 治理更可控:工具级权限、参数校验、调用审计,天然适配生产规范。
- 扩展更简单:新增一个工具就是一个新能力,不会牵动全局脚本。
14、还能怎么进化?
- 流式回显与多轮纠错:长命令执行过程可边看边纠错。
- 多厂商支持:抽象命令 DSL,适配不同网络设备。
- 灰度/审批流:把高危命令接入审批或沙箱环境验证后再上生产。
15、性能与稳定性建议
- 连接复用与并发:按任务类型复用会话,限制并发,防止设备侧资源耗尽。
- 自适应等待:基于回显标识符/提示符优化 sleep,减少固定等待带来的抖动。
- 超时与重试:区分连接超时、执行超时、写盘超时,分别设置重试与告警阈值。
- 回显截断保护:循环 recv_ready() 拉满缓冲,必要时按分页符拼接。
- 可观测性:在 MCP 调用链路记录关键信息(工具名、参数摘要、耗时、结果摘要),便于 SRE 观测与审计。
16、安全治理与审计
- 白名单与最小权限:对工具名、命令集合做白名单;账户最小授权。
- 敏感操作分级:保存配置、重启等高危操作走审批或沙箱验证。
- 参数校验与脱敏:IP、用户名、路径等参数校验;日志中对口令等敏感信息脱敏。
- 审计回放:保留 MCP 调用链路与设备回显摘要,支持按工单检索与回放。
17、部署清单(速查)
- 准备运行环境,安装依赖并配置 SSH 可达。
- 启动 ensp server,确认三类工具可被 list_tools 发现。
- 配置客户端(如 Claude Desktop / Cline)加载 MCP,连通本地 server。
- 跑通“配置 → 查询 → 落盘”的最小闭环,并固化参数模板与权限策略。
18、结语
网络自动化的难点,不只是“写脚本”,而是“把复杂能力包装成安全、好用、可治理的服务”。MCP 提供了这个“服务壳”。配合 ENSP 与少量 Python 代码,就能让自动化从“工程师能用”,走向“团队都能用”。
如果你正在推进网络自动化,不妨从这套最小实现开始:先用一次真实变更把链路跑通,再逐步把工具库做厚。觉得有帮助,欢迎收藏与转发;需要完整工程与模板,评论区留「ENSP」,我打包发你。
附:精选配图
为便于阅读,本文已将关键配图穿插到对应小节。这里仅保留少量示意图: