先说说背景吧。公司网络规模越来越大,交换机从几百台长到上千台。传统巡检靠人工,问题一大堆:
- 效率低:一台台SSH登录,敲
display version、display interface brief之类的命令,重复劳动能把人逼疯。 - 数据不规范:收集的信息散落在各种Excel里,后期分析头疼。
自动化后,这些问题基本解决。脚本可以24小时待命,定时跑任务,输出结构化的报告,还能对接邮件或企业微信通知。关键是,它解放了我们这些“救火队员”,能把精力放在更重要的优化和架构设计上。

我第一次试水的时候,只巡检了10台设备,就觉得“哇,这也太香了”。后来逐步扩展到1000台,中间踩了不少坑,但也积累了很多经验。今天全分享给大家。
工欲善其事,必先利其器。咱们需要的工具其实不多,但要选对。
Python环境:推荐Python 3.8+。我用的是3.11,兼容性好。
- Netmiko:强烈推荐!它对华为设备支持很好,封装了SSH连接、命令发送、分页处理等细节,比原生Paramiko省心多了。安装:
pip install netmiko - Pandas:处理数据、生成Excel报告神器。
pip install pandas openpyxl - Concurrent.futures 或 ThreadPoolExecutor:处理并发,1000台设备不能一台台串行跑。
- 可选:TextFSM 或 ntc-templates,用于结构化解析命令输出(后面会讲)。
- Paramiko:Netmiko底层就是它,如果你想更底层控制也可以了解。
设备信息管理:别把IP、用户名、密码硬编码!用Excel、CSV或JSON文件存设备清单。示例CSV格式:
ip,hostname,device_type,username,password192.168.1.1,SW-01,huawei,admin,YourPass192.168.1.2,SW-02,huawei,admin,YourPass...
- 网络连通性:确保你的脚本服务器能访问所有设备。防火墙、ACL别挡路。
- 并发控制:1000台别一股脑全上,建议分批或限流(比如并发50-100),避免把交换机或自己服务器搞崩。
我一般把这些配置写在一个devices.csv和config.py里,方便维护。
核心脚本
咱们先从最简单的一台设备开始,逐步完善。
基础连接示例(用Netmiko):
from netmiko import ConnectHandlerimport timedefconnect_and_run(ip, username, password): device = {'device_type': 'huawei','host': ip,'username': username,'password': password,'port': 22,'timeout': 30, }try:with ConnectHandler(**device) as conn: conn.enable() # 如果需要进入特权模式 output = conn.send_command("display version") print(f"{ip} 连接成功!版本信息:\n{output[:200]}...") # 截取一部分看效果return outputexcept Exception as e: print(f"{ip} 连接失败: {str(e)}")returnNone

简单吧?Netmiko自动处理了很多华为设备的“脾气”,比如分页---- More ----。
常用巡检命令清单(这些是我日常必查的):
display fan / display power:风扇、电源display cpu-usage / display memory:CPU内存占用display interface brief:接口摘要display interface description:接口描述display arp / display mac-address:ARP和MAC表display current-configuration:当前配置(可选,输出大)
你可以把这些命令放一个列表里,循环执行。
commands = ["display version","display device","display cpu-usage",# ... 更多]
并发处理1000台:用ThreadPoolExecutor。
from concurrent.futures import ThreadPoolExecutor, as_completedimport csvdefmain(): devices = []with open('devices.csv', 'r') as f: reader = csv.DictReader(f) devices = list(reader) results = {}with ThreadPoolExecutor(max_workers=50) as executor: # 根据服务器性能调整 future_to_ip = {executor.submit(connect_and_run, dev['ip'], dev['username'], dev['password']): dev['ip'] for dev in devices}for future in as_completed(future_to_ip): ip = future_to_ip[future]try: results[ip] = future.result()except Exception as exc: results[ip] = f"Error: {exc}"# 保存结果with open('inspection_results.txt', 'w') as f:for ip, data in results.items(): f.write(f"--- {ip} ---\n{data}\n\n") print("巡检完成!")if __name__ == "__main__": main()

跑起来后,你会看到终端刷刷刷地输出,效率直接拉满。实际测试中,50并发下1000台大概2-4小时搞定(取决于网络和命令复杂度)。
数据解析与报告生成
原始命令输出是文本,读起来费劲。我们可以用Pandas生成Excel,或者简单用TextFSM解析关键字段。
简单版:把每个命令结果存到字典,再转DataFrame。
import pandas as pd# 假设results是字典data = []for ip, outputs in results.items(): row = {'IP': ip, 'Version': extract_version(outputs.get('display version', '')), ...} data.append(row)df = pd.DataFrame(data)df.to_excel('巡检报告_20250612.xlsx', index=False)
提取函数可以用正则或字符串查找实现。比如提取CPU利用率:
import redefextract_cpu(output): match = re.search(r'CPU usage:\s*(\d+)%', output)return match.group(1) if match else'N/A'
高级点推荐TextFSM + ntc-templates,它能把display interface brief解析成结构化表格。
常见坑
- 连接超时/失败:设备太多,网络抖动常见。加重试机制(retry 3次),用exponential backoff。
- 命令输出分页:Netmiko基本能处理,但有些老设备顽固,可以
conn.send_command("screen-length 0")先关分页。 - 权限问题:巡检账号别给太高权限。
display命令大多只读就够。 - 性能瓶颈:服务器CPU/内存不够?降低并发或分批跑(比如按区域分10组)。
- 安全:密码别明文存!用key文件、环境变量或密码管理工具(比如keyring库)。
- 华为设备特性:有些型号device_type用
huawei或huawei_vrp,测试确认。enable模式可能需要secret。 - 日志与异常:每个设备独立try-except,别让一台失败拖累全部。
我曾经因为没控制并发,把监控服务器搞得响应慢,领导还来问“网络是不是又出问题了”……血的教训啊。
上个月公司扩容,又加了300台新交换机。我把脚本一改,新增设备IP导入CSV,跑了一遍。全网健康情况一目了然,发现了十几处潜在隐患(比如几个电源老化、部分端口流量异常)。领导看完报告直呼“靠谱”,还给我申请了奖金。
从那以后,巡检从“每月苦哈哈”变成“每周自动跑”,大家工作幸福感up up。
自动化不是一蹴而就的。刚开始可能花一周时间调试,但后面节省的时间是指数级的。建议大家先在测试环境或少量设备上练手,熟悉Netmiko的脾气,再大规模推广。
代码我不会一次性全贴(太长了),但核心思路和片段都分享了。你可以根据自己环境改改。如果有具体问题,欢迎在评论区留言,或者私信我交流。咱们一起进步!
记得备份好现有配置,安全第一。网络运维这条路,工具是帮手,经验和责任心才是根本。
喜欢这篇文章的兄弟,点个在看、转发给需要的朋友。