
设备清单创建一个 Python 文件把设备信息写进去。设备少可直接硬编码多了可换成 CSV 读取。devices [ {host: 10.1.1.1, device_type: cisco_ios}, {host: 10.1.1.2, device_type: huawei}, {host: 10.1.2.1, device_type: cisco_ios}, # 把你的设备全部加进来 ] CREDENTIALS { username: admin, password: your_password, }第二步定义巡检命令不同厂商命令不一样用一个字典来做映射。你可以根据环境自由增减。CHECK_COMMANDS { cisco_ios: [ (show version | include Version, 软件版本), (show ip interface brief, 接口状态), (show processes cpu sorted | exclude 0.00%, CPU占用), (show memory statistics, 内存使用), (show logging | include %, 异常日志), (show ip route summary, 路由表概要), ], huawei: [ (display version | include VRP, 软件版本), (display ip interface brief, 接口状态), (display cpu-usage, CPU占用), (display memory-usage, 内存使用), (display logbuffer | include Error, 异常日志), (display ip routing-table statistics, 路由表概要), ], }第三步并发巡检核心一台一台串行太慢用线程池并发。30 台设备并发 10 线程3 分钟全部跑完。from concurrent.futures import ThreadPoolExecutor, as_completed from netmiko import ConnectHandler from datetime import datetime MAX_WORKERS 10 # 同时连接 10 台设备 def inspect_device(dev): 巡检单台设备返回结果字典 result { 设备: dev[host], 厂商: dev[device_type], 巡检时间: datetime.now().strftime(%Y-%m-%d %H:%M:%S), 状态: 成功, } # 合并凭据 login {**dev, **CREDENTIALS} try: with ConnectHandler(**login) as conn: commands CHECK_COMMANDS.get(dev[device_type], []) for cmd, name in commands: try: output conn.send_command(cmd, read_timeout20) result[name] output.strip() except Exception as e: result[name] f[执行失败] {e} except Exception as e: result[状态] 连接失败 result[错误信息] str(e) return result # 并发执行 reports [] with ThreadPoolExecutor(max_workersMAX_WORKERS) as pool: futures {pool.submit(inspect_device, d): d for d in devices} for f in as_completed(futures): reports.append(f.result()) print(f巡检完成共 {len(reports)} 台设备)第四步生成 Excel 报告拿到数据只是第一步还得让老板看得懂。生成带颜色标注的 Excel异常项自动标红。import openpyxl from openpyxl.styles import Font, PatternFill, Alignment wb openpyxl.Workbook() ws wb.active ws.title f设备巡检报告_{datetime.now():%Y%m%d} # 表头 headers [设备, 厂商, 状态, 软件版本, 接口状态, CPU占用, 内存使用, 异常日志, 路由表概要] header_fill PatternFill(start_color1F4E79, end_color1F4E79, fill_typesolid) header_font Font(colorFFFFFF, boldTrue, size11) for col, h in enumerate(headers, 1): cell ws.cell(row1, columncol, valueh) cell.fill header_fill cell.font header_font cell.alignment Alignment(horizontalcenter) # 异常标记 red_fill PatternFill(start_colorFFC7CE, end_colorFFC7CE, fill_typesolid) red_font Font(color9C0006) # 写入数据 for row, report in enumerate(reports, 2): for col, key in enumerate(headers, 1): value report.get(key, ) ws.cell(rowrow, columncol, valuevalue) # 包含异常关键词则标红 if isinstance(value, str) and any( kw in value.lower() for kw in [down, error, fail, 失败] ): ws.cell(rowrow, columncol).fill red_fill ws.cell(rowrow, columncol).font red_font # 调整列宽 for col in ws.columns: ws.column_dimensions[col[0].column_letter].width 22 filename f巡检报告_{datetime.now():%Y%m%d}.xlsx wb.save(filename)运行效果巡检完成共 30 台设备 报告已生成巡检报告_20260521.xlsx打开 Excel所有设备一目了然。有异常的自动标红发给领导比你手动填的表格专业十倍。进阶方向这个脚本只是一个起点。你可以在此基础上接飞书/钉钉/企微机器人异常设备自动推送告警接数据库每次巡检结果入库做历史趋势对比定时运行crontab 每天 6 点跑一次早上到公司直接看报告二、会用库的网工一天干别人一周的活很多网工学 Python 的瓶颈不在语法在“不知道有哪些好用的库”。网络自动化领域已经有一套成熟的工具链这篇帮你一次性搞清楚。第一把刀Netmiko —— 网络设备的瑞士军刀如果你只能学一个库就学 Netmiko。它是 Paramiko 的上层封装专门为网络设备做 SSH 连接优化支持思科、华为、H3C、Juniper 等几十个厂商。from netmiko import ConnectHandler dev { device_type: huawei_vrp, host: 10.1.1.1, username: admin, password: pass, } try: with ConnectHandler(**dev) as conn: print( 设备版本信息 ) print(conn.send_command(display version)) except Exception as e: print(连接失败, e)Netmiko 帮你自动处理厂商差异——思科 enable 模式华为 system-view它都自动完成。适用场景日常登录设备执行命令、配置备份、批量巡检。第二把刀NAPALM —— 厂商无关的网络抽象Netmiko 的局限是命令厂商相关。思科show ip interface brief华为display ip interface brief。跨厂商脚本要写一堆 if-else。NAPALM 提供统一 API换厂商不改代码逻辑。from napalm import get_network_driver driver get_network_driver(ios) device_ip 10.1.1.1 username admin password pass try: with driver(device_ip, username, password, timeout30) as dev: facts dev.get_facts() print(主机名:, facts[hostname]) print(型号:, facts[model]) print(版本:, facts[os_version]) interfaces dev.get_interfaces() print(\n接口数量:, len(interfaces)) dev.discard_config() except Exception as e: print(连接/执行失败:, str(e))杀手功能compare_config()自动比对当前配置和待下发配置只显示差异变更窗口神器。适用场景多厂商环境、配置比对、BGP/OSPF 状态监控。第三把刀ntc-templates —— 把 show 输出变成结构化数据我们每天看这样的输出Interface IP-Address OK? Method Status GigabitEthernet0/0 10.1.1.1 YES NVRAM up GigabitEthernet0/1 unassigned YES NVRAM down想在脚本里拿到“哪个接口是 down 的”以前得写正则解析。ntc-templates 说不用了。from netmiko import ConnectHandler device { device_type: cisco_ios, host: 10.1.1.1, username: admin, password: pass } with ConnectHandler(**device) as conn: output conn.send_command(show ip interface brief, use_textfsmTrue) for intf in output: print(intf[intf], intf[status])use_textfsmTrue背后就是 ntc-templates 在干活内置上百个厂商命令解析模板输出直接变成字典列表。适用场景任何需要结构化解析 CLI 输出的场景。第四把刀TextFSM —— 自定义解析适配非标设备ntc-templates 覆盖不了的非标输出、工控设备、安全设备用 TextFSM 自己写模板。模板文件show_int.templateValue INTF (\S) Value IPADDR (\S) Value STATUS (up|down)