1. 从一次深夜巡检说起:OpenClaw 批量检测交换机与路由器状态到底解决什么问题
凌晨两点,你手里攥着一份 Excel 设备清单,准备逐台 SSH 登录 200 台交换机和路由器,敲show interface、show cpu、show version,再把结果复制到表格里。这个场景对运维人来说太熟悉了。问题不在于命令难,而在于重复劳动多、窗口时间短、人工判断容易漏。网络设备自动巡检方案的核心,就是用 OpenClaw 把「登录—执行命令—解析结果—生成巡检报告」这条链路自动化。
OpenClaw 在这里扮演的是一个轻量级自动化编排框架:它负责维护 SSH 连接池、按设备清单并发下发命令、把不同厂商的 CLI 输出归一化,最后把结构化数据交给报告模板。它适合谁?适合手里有几十到几百台交换机/路由器、又不想上重型网管平台的运维团队。你可以把它理解成一个「会自己跑命令的巡检员」,你只需要告诉它去哪台设备、执行什么命令、结果怎么判断。
我试过用纯 Shell 脚本加expect做类似的事,设备一多就卡在连接超时和输出解析上。OpenClaw 的价值在于把连接管理、重试、并发控制这些脏活封装掉,让你专注在巡检项本身。下面我会按「环境准备—配置片段—命令模板—报告校验—排错」的顺序,把可复制的落地路径写清楚。全文围绕 OpenClaw、交换机、路由器、巡检报告、SSH 这几个关键词展开,每一步都能直接跟做。
2. 前置准备:OpenClaw 环境、设备清单与 SSH 凭据管理
在写配置之前,先把三样东西准备好:OpenClaw 运行环境、设备清单文件、SSH 凭据。这一步不做扎实,后面批量巡检一定会在连接阶段翻车。
2.1 安装 OpenClaw 与基础依赖
OpenClaw 通常以 Python 包或二进制形式分发,建议在独立的虚拟环境里跑,避免和系统 Python 冲突。以 Python 环境为例:
python3 -m venv openclaw-env source openclaw-env/bin/activate pip install openclaw paramiko netmiko jinja2 pandasparamiko和netmiko是 SSH 连接与多厂商 CLI 适配的底层依赖,jinja2用来渲染巡检报告模板,pandas用来做结果汇总。安装完成后用openclaw --version确认可执行文件在 PATH 里。
如果你的设备数量超过 100 台,建议把 OpenClaw 跑在一台跳板机或运维专机上,确保这台机器到所有设备的 SSH 可达。可以用下面这段脚本先做一轮可达性预检:
while read -r ip; do ping -c 2 -W 2 "$ip" >/dev/null 2>&1 && echo "$ip OK" || echo "$ip UNREACHABLE" done < devices.txt把不可达的设备先剔出去,能省掉后面大量超时等待。
2.2 设备清单文件怎么写
设备清单是巡检的输入源,建议用 CSV 或 YAML,字段至少包含设备名、管理 IP、厂商、设备角色、SSH 端口。CSV 版本如下:
hostname,mgmt_ip,vendor,role,ssh_port core-sw-01,10.0.0.1,cisco,core,22 agg-sw-02,10.0.0.2,huawei,aggregation,22 edge-rt-01,10.0.0.3,h3c,edge,22厂商字段很关键,因为 Cisco、华为、H3C 的show命令输出格式不同,OpenClaw 需要根据vendor选择对应的解析器。角色字段用来决定巡检项,比如核心交换机要查 BGP 邻居,接入交换机只需要查接口错包和 CPU。
2.3 SSH 凭据的安全存放
不要把明文密码写进配置文件。推荐用环境变量加加密凭据库的方式。先设置环境变量:
export OPENCLAW_SSH_USER="netops" export OPENCLAW_SSH_PASS="your-encrypted-pass"然后在 OpenClaw 配置里引用${OPENCLAW_SSH_USER}。如果团队有密钥体系,优先用 SSH Key,把公钥提前推到设备的local-user或username配置里。密钥方式比密码方式稳定,批量并发时不容易触发设备的登录失败锁定。
注意:部分交换机默认限制并发 SSH 会话数,比如同时只允许 5 个 vty 连接。批量巡检前先确认设备的
user-interface vty最大会话数,必要时临时调大,巡检结束后恢复。
3. 可复制配置:OpenClaw 巡检任务 JSON 与命令模板
这一节是整篇的核心,给出可以直接落地的 OpenClaw 配置片段。配置文件建议命名为inspection.json,放在项目根目录。
3.1 主配置文件 inspection.json
{ "inventory": "devices.csv", "concurrency": 20, "timeout": 30, "retry": 2, "retry_interval": 5, "credentials": { "username": "${OPENCLAW_SSH_USER}", "password": "${OPENCLAW_SSH_PASS}", "key_file": "~/.ssh/id_rsa" }, "tasks": [ { "name": "device_health", "vendor_commands": { "cisco": ["show version", "show processes cpu | include CPU", "show memory statistics"], "huawei": ["display version", "display cpu-usage", "display memory-usage"], "h3c": ["display version", "display cpu-usage", "display memory"] }, "parser": "health_parser" }, { "name": "interface_status", "vendor_commands": { "cisco": ["show interfaces | include errors"], "huawei": ["display interface | include error"], "h3c": ["display interface | include error"] }, "parser": "interface_parser" } ], "report": { "template": "report_template.j2", "output_dir": "./reports", "format": ["html", "csv"] } }concurrency控制并发数,20 是一个比较稳的起点,设备性能差或 vty 限制严的可以降到 10。retry和retry_interval是失败重试,后面排错章节会详细讲。
3.2 命令模板与厂商适配
不同厂商的命令差异用vendor_commands映射解决。如果你的设备型号更杂,可以再细分一层,比如按role区分核心和接入:
{ "name": "bgp_check", "role_commands": { "core": { "cisco": ["show bgp summary"], "huawei": ["display bgp peer"], "h3c": ["display bgp peer ipv4"] } } }这样核心设备才跑 BGP 检查,接入设备跳过,减少无效命令和解析负担。
3.3 报告模板 report_template.j2
用 Jinja2 渲染 HTML 报告,字段包括设备名、巡检时间、CPU 使用率、内存使用率、接口错包数、异常等级:
<!DOCTYPE html> <html> <head><meta charset="utf-8"><title>网络设备巡检报告</title></head> <body> <h1>巡检报告 {{ report_time }}</h1> <table border="1"> <tr><th>设备</th><th>CPU</th><th>内存</th><th>接口错包</th><th>等级</th></tr> {% for d in devices %} <tr> <td>{{ d.hostname }}</td> <td>{{ d.cpu }}</td> <td>{{ d.memory }}</td> <td>{{ d.interface_errors }}</td> <td>{{ d.severity }}</td> </tr> {% endfor %} </table> </body> </html>模板里的severity由解析器根据阈值判定,比如 CPU 超过 90% 标 CRIT,接口错包大于 0 标 MAJOR。
3.4 启动巡检任务
配置齐了之后,一条命令启动:
openclaw run --config inspection.json --inventory devices.csv --output ./reports执行过程中 OpenClaw 会打印每台设备的连接状态和命令执行结果。跑完后./reports下会生成带时间戳的 HTML 和 CSV 文件。
4. 验证请求与成功结果:巡检报告字段校验与失败重试
配置写完不代表能跑通,必须做验证。这一节给出具体的验证动作和预期结果。
4.1 单设备冒烟测试
先拿一台设备验证 SSH 和命令解析是否正常:
openclaw run --config inspection.json --inventory devices.csv --filter core-sw-01 --dry-run--dry-run只连接并执行命令,不生成报告,方便你看原始输出。预期看到类似:
[INFO] connecting to core-sw-01 (10.0.0.1) via ssh [INFO] executing: show version [INFO] executing: show processes cpu | include CPU [INFO] parsed cpu=23%, memory=41% [INFO] device core-sw-01 OK如果parsed行有值,说明解析器工作正常。
4.2 报告字段校验
生成报告后,用一段脚本校验关键字段是否为空:
import pandas as pd df = pd.read_csv("./reports/inspection_latest.csv") required = ["hostname", "cpu", "memory", "interface_errors", "severity"] missing = df[required].isnull().sum() print(missing) assert missing.sum() == 0, "存在空字段,检查解析器"如果某个字段整列为空,通常是命令输出格式和正则不匹配,回到解析器里调整。
4.3 失败重试验证
故意把一台设备的 IP 改错,观察重试行为:
[WARN] connect to 10.0.0.99 failed, retry 1/2 [WARN] connect to 10.0.0.99 failed, retry 2/2 [ERROR] device 10.0.0.99 marked as UNREACHABLE预期结果是重试两次后标记为不可达,但不影响其他设备继续巡检。这就是并发加隔离的价值。
4.4 成功结果长什么样
一次完整巡检结束后,报告里应该能看到每台设备的 CPU、内存、接口错包和异常等级。正常情况下大部分设备是 OK,少数标 MAJOR 或 CRIT 的需要人工跟进。把报告和上一期对比,就能看出哪些设备指标在恶化。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
批量 SSH 巡检最容易在这几类错误上卡住,逐个说清楚。
5.1 401 Authentication failed
paramiko.ssh_exception.AuthenticationException: Authentication failed.原因通常是用户名密码错、密钥没推、或者设备只允许特定源 IP 登录。排查顺序:先用ssh -v netops@10.0.0.1手动连一次,确认凭据本身没问题;再检查 OpenClaw 读到的环境变量是否为空,echo $OPENCLAW_SSH_USER验证;最后确认设备 ACL 是否放行了跳板机 IP。
5.2 local proxy failed
[ERROR] local proxy failed: connection refused这个报错一般出现在你通过本地端口转发或跳板代理连接设备时。检查跳板机上的转发进程是否还在,端口是否被占用。如果是 OpenClaw 配置里写了proxy字段,确认代理地址和端口正确。注意不要使用任何违规的网络代理工具,企业环境应走合规的堡垒机或跳板机。
5.3 reading choices 相关解析错误
[ERROR] reading choices failed: unexpected output format这是解析器报错,说明设备返回的 CLI 输出和正则不匹配。常见原因是设备语言是中文、或者命令被分页打断。解决办法:在命令前加terminal length 0(Cisco)或screen-length 0 temporary(华为/H3C)关闭分页;确认设备 CLI 语言为英文;把原始输出打到日志里,对照正则逐行调。
5.4 OAuth 相关报错
[ERROR] OAuth token expired如果你把巡检结果推送到内部平台或工单系统,可能用到 OAuth 令牌。令牌过期就重新获取,并在配置里加上自动刷新逻辑。如果只是本地生成报告,不涉及 OAuth,可以忽略这类配置。
5.5 三件套检查清单
无论哪种接入方式,出现连接类报错时,先核对三件套:Base URL、Key、Model ID。以 OpenClaw 对接模型服务做报告摘要为例,配置里要写全:
{ "llm": { "base_url": "https://taotoken.net/api", "api_key": "${TAOTOKEN_API_KEY}", "model_id": "claude-sonnet-4-5" } }Base URL 指向 API 入口,Key 从控制台生成,Model ID 按实际使用的模型填写。三者缺一,请求就会失败。
6. 把巡检跑成日常:接入方式与持续优化
巡检脚本跑通一次不难,难的是让它稳定跑成日常。建议把 OpenClaw 任务挂到 cron 或内部调度平台上,每天凌晨业务低峰期执行。报告生成后自动推送到运维群或工单系统,异常设备直接生成待办。
如果你需要让 OpenClaw 在巡检后自动生成一段自然语言的分析摘要,可以接入模型对话能力,把结构化结果转成可读结论。API Key 在控制台创建,接入文档里有完整的请求示例。对于需要长期跑编码和 Agent 任务的团队,Coding Plan 提供了更稳定的调用额度,适合把巡检、报告、告警串成一条自动化流水线。
最后给一个实用技巧:把每次巡检的 CSV 结果按日期归档,用 pandas 做趋势对比。连续三周 CPU 缓慢上升的设备,往往比一次性飙高的更值得关注。巡检报告的价值不在单次快照,而在时间序列里的异常拐点。