查看: 156|回复: 1

Python + Netmiko实现华为交换机批量巡检自动化脚本实战

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
网络运维中,面对成百上千台华为交换机,人工SSH登录逐台巡检 display version、display interface brief 等命令效率低下且容易出错。本文提供一套基于 Python 3.11 与 Netmiko 的批量自动化巡检方案,通过配置文件管理设备清单、并发执行命令、解析输出并生成 Excel 报告,同时集成重试、超时、阈值告警等机制。所有代码均可在实际环境中直接部署。




一、环境准备与依赖安装

推荐使用 Python 3.8+(本文用 3.11)。核心依赖为 Netmiko(SSH 连接与命令执行)、Pandas(数据处理)、openpyxl(Excel 写入)、Paramiko(SSH 底层库)。可选 ntc-templates 和 textfsm 用于结构化解析输出。安装命令:
  1. pip install netmiko pandas openpyxl paramiko
复制代码

设备清单存放在 devices.csv 中,格式如下(严禁硬编码密码):
  1. ip,hostname,device_type,username,password,secret
  2. 192.168.1.1,SW-Core-01,huawei,admin,YourPass,enable_pass
  3. 192.168.1.2,SW-Access-01,huawei,admin,YourPass,enable_pass
复制代码

交换机需开启 SSH 并配置只读权限巡检账号,脚本服务器需保证与目标网络连通。并发建议控制在 50~100 以内,避免设备负载过高。




二、项目结构与核心模块

项目目录:
  1. huawei_inspection/
  2. ├── devices.csv          # 设备清单
  3. ├── config.py            # 全局配置(命令列表、超时、重试、阈值)
  4. ├── inspection.py        # 主程序入口
  5. ├── parsers.py           # 命令输出解析函数
  6. ├── reporter.py          # 报告生成模块
  7. └── logs/                # 日志目录
复制代码




三、全局配置文件 config.py

定义巡检命令列表、并发线程数、超时参数、重试策略以及阈值告警:
  1. # config.py
  2. INSPECTION_COMMANDS = [
  3.     "display version",
  4.     "display device",
  5.     "display fan",
  6.     "display power",
  7.     "display cpu-usage",
  8.     "display memory",
  9.     "display interface brief",
  10.     "display interface description",
  11.     "display arp",
  12.     "display mac-address",
  13.     "display logbuffer",
  14.     "display temperature",
  15. ]
  16. MAX_WORKERS = 50
  17. CONNECT_TIMEOUT = 30
  18. READ_TIMEOUT = 30
  19. MAX_RETRIES = 3
  20. RETRY_DELAY = 2
  21. REPORT_DIR = "./reports"
  22. LOG_DIR = "./logs"
  23. CPU_THRESHOLD = 80
  24. MEM_THRESHOLD = 80
  25. TEMP_THRESHOLD = 60
复制代码




四、连接与命令执行模块 connector.py

通过 Netmiko 连接设备,支持 enable 密码、自动关闭分页、使用指数退避重试。核心函数:
  1. # connector.py(核心代码片段)
  2. from netmiko import ConnectHandler
  3. from netmiko.exceptions import NetmikoTimeoutException, NetmikoAuthenticationException
  4. import config
  5. def connect_huawei_device(device_info):
  6.     device = {
  7.         'device_type': 'huawei',
  8.         'host': device_info['ip'],
  9.         'username': device_info['username'],
  10.         'password': device_info['password'],
  11.         'port': 22,
  12.         'timeout': config.CONNECT_TIMEOUT,
  13.         'read_timeout': config.READ_TIMEOUT,
  14.     }
  15.     if 'secret' in device_info and device_info['secret']:
  16.         device['secret'] = device_info['secret']
  17.     try:
  18.         conn = ConnectHandler(**device)
  19.         if device_info.get('secret'):
  20.             conn.enable()
  21.         return conn
  22.     except (NetmikoAuthenticationException, NetmikoTimeoutException) as e:
  23.         return None
  24. def inspect_single_device(device_info, commands=None):
  25.     # 含重试机制,最多尝试3次,间隔递增
  26.     for attempt in range(1, config.MAX_RETRIES + 1):
  27.         conn = connect_huawei_device(device_info)
  28.         if conn is None:
  29.             if attempt < config.MAX_RETRIES:
  30.                 time.sleep(config.RETRY_DELAY * attempt)
  31.             continue
  32.         try:
  33.             outputs = run_commands(conn, commands)
  34.             conn.disconnect()
  35.             return {'status':'success', 'outputs':outputs, ...}
  36.         except:
  37.             conn.disconnect()
  38.             if attempt == config.MAX_RETRIES:
  39.                 return {'status':'failure', ...}
复制代码




五、输出解析模块 parsers.py

使用正则表达式从命令输出中提取结构化数据,并判断是否超过阈值。支持解析 version、cpu-usage、memory、interface brief、power、fan、temperature、logbuffer 等。例如 parse_cpu 函数:
  1. # parsers.py(片段)
  2. import re
  3. import config
  4. def parse_cpu(output):
  5.     result = {'cpu_usage': 'N/A', 'alarm': False}
  6.     match = re.search(r'CPU Usage\s*:\s*(\d+)%', output, re.I)
  7.     if not match:
  8.         match = re.search(r'CPU utilization\s*[\s:]+(\d+)%', output, re.I)
  9.     if match:
  10.         cpu_val = int(match.group(1))
  11.         result['cpu_usage'] = cpu_val
  12.         result['alarm'] = cpu_val > config.CPU_THRESHOLD
  13.     return result
复制代码

解析后的数据会汇总到 parsed 字典中,供报告生成使用。




六、报告生成模块 reporter.py

利用 Pandas 将巡检结果写入 Excel,包含汇总 sheet 和明细 sheet(可选)。自动在 REPORT_DIR 下生成带时间戳的文件:
  1. # reporter.py(简化)
  2. import pandas as pd
  3. from datetime import datetime
  4. def generate_excel_report(results, output_path=None):
  5.     if not output_path:
  6.         output_path = f"./reports/巡检报告_{datetime.now():%Y%m%d_%H%M%S}.xlsx"
  7.     summary_data = []
  8.     for res in results:
  9.         row = {
  10.             'IP地址': res['ip'],
  11.             '主机名': res['hostname'],
  12.             '巡检状态': '成功' if res['status']=='success' else '失败',
  13.             'CPU使用率': res.get('parsed',{}).get('cpu',{}).get('cpu_usage', 'N/A'),
  14.             # ... 其它字段
  15.         }
  16.         summary_data.append(row)
  17.     df = pd.DataFrame(summary_data)
  18.     df.to_excel(output_path, index=False)
  19.     return output_path
复制代码




七、主程序与定时执行

主程序 inspection.py 读取 devices.csv,使用 ThreadPoolExecutor 并发调用 inspect_single_device,然后解析所有输出并生成报告。如需定时执行,可用系统的 cron 或 Windows 任务计划程序调用该脚本。




八、常见问题与最佳实践

- 连接超时/失败:检查 SSH 服务、防火墙、账号权限。增加重试与指数退避。
- 命令输出分页:Netmiko 的 send_command 已自动处理分页,但也可在命令后加 | no-more。
- 权限不足:巡检账号使用只读视图或 privilege level。
- 性能瓶颈:分批巡检(每批 50 台),避免同时打开过多 SSH 连接。
- 密码安全:使用 CSV 存储时注意权限,或对接 vault 服务。
- 结果验证:定期人工抽检脚本记录与设备实际状态是否一致。




九、总结

本方案通过 Python + Netmiko 实现了华为交换机的批量巡检自动化,将原本数小时的人工操作缩短到分钟级,并输出标准化报告便于存档分析。代码可直接套用,只需调整设备清单和阈值参数即可适配不同规模网络。对于上千台交换机环境,建议结合异步框架(如 asyncio)进一步优化并发性能。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python + Netmiko实现华为交换机批量巡检自动化脚本实战

非常实用的方案!我之前也尝试过类似思路,但并发控制这块没处理好,经常有设备超时。你这里的重试加指数退避和阈值预警机制很到位,尤其CPU、内存、温度三个阈值正好是我们日常运维最关注的。配置文件的模块化设计也很清晰,后续扩展命令或者增加厂商支持应该很方便。 有一个小建议:设备清单里密码明文保存还是有点风险,能否考虑用环境变量或者加密配置文件(比如使用python的keyring库)来存储?另外日志目录和报告目录自动创建的逻辑,代码里是否也包含了?期待后续完整代码分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-22 12:19 , Processed in 0.026524 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部