Python自动化:华为交换机配置批量备份与智能预处理
1. 华为交换机配置备份的痛点与Python自动化方案每次月底备份几十台华为交换机的配置时我都得挨个登录设备、输入命令、保存文件。最崩溃的是有次误操作覆盖了关键配置花了整整两天才恢复。这种重复劳动不仅效率低下还容易出错。后来我发现用Python脚本可以完美解决这些问题今天就分享这套经过实战检验的自动化方案。传统手动备份的三大致命伤首先登录每台设备平均要3分钟100台设备就是5小时纯机械操作其次密码输入错误、命令敲错都是家常便饭最重要的是备份文件命名混乱紧急恢复时根本找不到对应版本。而我们的Python脚本能做到自动从Excel表格读取设备信息IP/账号/密码智能检测并配置FTP传输服务按设备名型号时间戳规范保存文件同时生成txt和cfg双格式备份实测下来原来需要5小时的工作现在10分钟就能完成而且备份文件整整齐齐。这个方案特别适合管理10台以上华为交换机的运维团队不需要额外购买软件用PythonExcel就能搭建自动化流水线。2. 环境准备与依赖库安装2.1 Python环境配置建议我强烈建议使用Python 3.8版本这个版本对第三方库的兼容性最稳定。遇到过有同事用Python 3.6跑脚本时报paramiko的加密算法错误升级后问题立即解决。如果你同时管理多套Python环境用conda创建独立环境是个好主意conda create -n network_backup python3.8 conda activate network_backup2.2 必须安装的四大金刚库这几个库是我们脚本的核心依赖建议用pip安装时指定版本号避免兼容问题pip install paramiko2.11.0 pandas1.5.3 openpyxl3.0.10paramiko处理SSH连接的神器支持密码和密钥认证。我在华为S5700系列交换机上测试时发现需要开启stelnet server enable服务才能正常连接pandas读取Excel设备信息表的关键注意表格需要包含IP、管理员账号、密码三列openpyxl处理xlsx格式的Excel文件比xlrd库更稳定socketPython内置库用来获取本机IP地址配置FTP白名单遇到过最坑的问题是公司电脑有多网卡时socket获取的IP可能不对。这时候可以手动指定IP# 替代get_local_ip()函数 local_ip 192.168.1.100 # 填写实际用于FTP传输的IP3. 设备信息表的设计规范3.1 Excel表格的标准格式我们的脚本依赖一个结构化的设备信息表建议保存在桌面并命名为交换机设备信息表.xlsx。表格需要包含以下字段IP地址管理员账号密码设备命名设备型号192.168.1.1adminAbc123核心交换S5700192.168.1.2admin123Abc接入交换S3700重要提示第一行必须是标题行名称需完全匹配脚本中的字段名密码字段建议使用统一加密方式存储脚本中可以添加解密逻辑设备型号需要与华为实际型号一致会用于备份文件命名3.2 多厂商设备兼容方案虽然主要针对华为交换机但实际项目中常遇到多品牌设备共存的情况。通过简单修改就能支持H3C等设备# 在export_config函数中添加设备类型判断 if H3C in device_info[设备型号]: commands [display current-configuration\n] # H3C保存命令不同 else: commands [display current-configuration\n, save\n]4. 核心代码实现详解4.1 FTP服务自动配置的玄机华为交换机默认可能关闭FTP服务我们的脚本会自动检测并开启。这里有个坑要注意不同系统版本命令可能有差异def setup_ftp(ssh, local_ip): # VRP5.x版本命令 commands_v5 [ ftp server enable\n, facl number 2000\n, frule permit source {local_ip} 0\n ] # VRP8.x版本命令 commands_v8 [ ftp server enable\n, fftp server acl permit source ip {local_ip}\n ] # 先发送查询命令判断版本 ssh.send(display version\n) time.sleep(2) output ssh.recv(65535).decode(utf-8) if VRP5 in output: [ssh.send(cmd) for cmd in commands_v5] else: [ssh.send(cmd) for cmd in commands_v8]4.2 配置备份的异常处理机制网络设备运维最怕的就是脚本执行到一半报错退出。我们给关键操作都加了异常捕获try: client.connect(ip, usernameusername, passwordpassword, timeout10) except paramiko.ssh_exception.NoValidConnectionsError: print(f{ip} 连接失败检查网络连通性) with open(error_log.txt, a) as f: f.write(f{datetime.now()} {ip} 连接失败\n) return except paramiko.ssh_exception.AuthenticationException: print(f{ip} 认证失败检查账号密码) return5. 备份文件智能管理方案5.1 多维度归档策略原始脚本只是简单按时间戳归档实际使用中我优化为三级目录结构20230815_备份/ ├── 核心区域/ │ ├── S5700_核心交换_202308151030.txt │ └── S5700_核心交换_202308151030.cfg ├── 接入区域/ │ ├── S3700_接入交换1_202308151031.txt │ └── S3700_接入交换2_202308151032.cfg └── backup_log.csv # 记录备份状态和时间实现这个结构只需要修改create_folder函数def create_folder(area): base_path os.path.join(os.path.expanduser(~), Desktop) date_folder datetime.now().strftime(%Y%m%d) _备份 area_path os.path.join(base_path, date_folder, area) os.makedirs(area_path, exist_okTrue) return area_path5.2 配置差异对比技巧单纯的备份还不够我通常会用difflib实现自动比对import difflib def compare_config(new_file, old_file): with open(new_file) as f1, open(old_file) as f2: diff difflib.unified_diff( f2.readlines(), f1.readlines(), fromfileold_file, tofilenew_file ) return .join(diff) # 使用示例 changes compare_config(today.cfg, yesterday.cfg) if changes: with open(changes.log, w) as f: f.write(changes)6. 实战中的避坑指南6.1 华为设备特殊设置有些华为交换机需要额外配置才能支持我们的脚本确保stelnet服务已开启stelnet server enable修改用户权限local-user admin service-type ssh设置用户级别local-user admin privilege level 156.2 大规模执行的优化技巧当设备数量超过50台时建议添加多线程处理但要注意华为设备SSH连接数限制设置合理的超时时间client.connect(timeout15)在Excel中添加优先级字段先备份核心设备from concurrent.futures import ThreadPoolExecutor def batch_export(max_workers5): devices read_device_info() with ThreadPoolExecutor(max_workers) as executor: for _, row in devices.iterrows(): executor.submit(export_config, row[IP], ...)7. 扩展应用场景这套脚本框架经过简单改造还能实现定期自动巡检CPU/内存/端口状态采集配置批量修改如同时更新所有设备的SNMP社区字符串固件版本检查与升级比如要实现端口状态监控只需修改export_config函数中的命令commands [display interface brief\n] output ssh.recv(65535).decode(utf-8) # 解析输出获取异常端口最后提醒大家任何自动化操作前一定要先做好备份。我在脚本中内置了预检查模式添加--dry-run参数时只会测试连接不执行实际备份建议首次运行时使用这个模式验证。