详解批量交换机(锐捷)配置自动化脚本:从单设备操作到并发批量处理
在网络运维中,批量配置设备是常见需求。手动逐台操作不仅效率低下,还容易出错。本文将详细解析一个基于 Python 的批量交换机配置自动化脚本,该脚本利用netmiko实现设备连接,通过多线程并发提升效率,并配备完善的日志和异常处理机制,适用于企业级网络设备批量配置场景。
脚本整体功能概述
该脚本的核心目标是批量、高效、安全地为多台交换机配置指定命令(示例中为创建用户并配置 SSH 登录)。主要特点包括:
- 支持多设备并发配置,通过线程池控制并发数量
- 完善的日志记录,包括操作过程和结果,便于事后审计
- 全面的异常处理,针对连接超时、认证失败等常见问题单独处理
- 线程安全的数据统计,确保并发场景下结果计数准确
- 适配网络设备交互特性(如特权模式切换、配置保存确认提示)
模块结构解析
脚本采用模块化设计,各部分职责清晰,主要分为以下几个核心模块:
1. 依赖库导入
python
运行
from netmiko import ConnectHandler
from netmiko.exceptions import (
NetMikoAuthenticationException,
NetMikoTimeoutException
)
import logging
from datetime import datetime
import concurrent.futures
import threading
from typing import List, Dict
核心库作用解析:
netmiko:网络设备连接的核心库,支持多厂商设备(脚本中使用ruijie_os适配锐捷交换机),提供统一的设备交互接口logging:日志记录模块,用于记录操作过程和结果,是运维脚本的必备组件datetime:记录操作时间,用于统计总耗时concurrent.futures:提供线程池实现,简化并发编程(比直接使用threading更高效)threading:提供线程锁(Lock),解决多线程共享变量的线程安全问题typing:提供类型注解,提升代码可读性和 IDE 支持(如List[Dict]明确返回值类型)
2. 日志配置模块
python
运行
logging.basicConfig(
filename='switch_config.log',
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
encoding='utf-8'
)
日志是运维脚本的 "黑匣子",该配置实现了:
- 日志存储:输出到
switch_config.log文件,便于后续查阅 - 日志级别:
INFO级别(包含INFO、WARNING、ERROR),既记录关键操作,又避免冗余 - 日志格式:包含时间(
asctime)、级别(levelname)、消息(message),便于定位问题 - 编码设置:
utf-8编码确保中文日志正常显示(如设备中文提示信息)
3. 线程安全控制模块
python
运行
lock = threading.Lock()
为什么需要线程锁?在多线程场景下,多个线程可能同时修改共享变量(如脚本中的success_count、fail_count)。例如,两个线程同时读取success_count=5,各自 + 1 后写回,最终结果可能为 6(而非预期的 7),导致统计错误。
线程锁的作用是保证同一时间只有一个线程能修改共享变量,通过with lock:语句实现临界区保护,确保统计结果准确。
4. 单设备配置核心函数(configure_switch)
该函数是脚本的核心,负责单台交换机的连接、配置、保存全流程,返回配置结果。
4.1 设备信息定义
python
运行
device_info = {
'device_type': 'ruijie_os', # 设备类型(适配锐捷OS)
'ip': device_ip, # 设备IP地址
'username': 't_root', # 登录用户名
'password': 'wlzx2022!@#123',# 登录密码
'port': 22, # SSH端口
'secret': 'wlzx2022!@#0752', # enable特权密码
'global_delay_factor': 2, # 延迟系数(设备响应慢时增大)
'session_log': f'session_{device_ip}.log' # 单设备会话日志
}
关键参数说明:
device_type:netmiko支持的设备类型(如cisco_ios、huawei_vrp),需与设备型号匹配secret:网络设备特有的 "特权模式" 密码,通过conn.enable()激活global_delay_factor:解决设备响应慢导致的命令发送失败(默认 1,可根据设备性能调整)session_log:记录单设备的完整交互过程(如命令输入、设备回显),是调试的重要依据
4.2 配置命令定义
python
运行
config_commands = [
'username liangyongcheng password 0 Ruijie!@#0752',
'username liangyongcheng login mode ssh',
]
命令以列表形式定义,后续通过send_config_set批量发送。实际使用中可根据需求扩展(如 VLAN 配置、接口配置等)。
4.3 设备连接与配置流程
python
运行
with ConnectHandler(**device_info) as conn:
# 进入特权模式
conn.enable()
# 发送配置命令
output = conn.send_config_set(config_commands)
# 保存配置(处理确认提示)
save_output = conn.send_command(
"write memory",
expect_string=r"[#>]",
read_timeout=30
)
if "Y/N" in save_output:
save_output += conn.send_command("Y", expect_string=r"[#>]", read_timeout=30)
流程解析:
- 连接管理:使用
with语句自动管理连接生命周期(无需手动conn.disconnect()) - 特权模式:网络设备配置通常需要进入特权模式(
enable),通过conn.enable()实现 - 配置下发:
send_config_set自动进入全局配置模式(configure terminal),批量执行命令 - 配置保存:通过
write memory保存配置,针对设备可能出现的 "Y/N" 确认提示,额外发送 "Y" 确认
4.4 异常处理机制
python
运行
except NetMikoTimeoutException:
# 处理连接超时(设备离线、网络不通)
except NetMikoAuthenticationException:
# 处理认证失败(用户名/密码错误)
except Exception as e:
# 处理其他未知错误(如命令错误、设备异常)
异常处理是脚本健壮性的关键:
- 针对性捕获常见异常,返回明确的错误原因(如 "连接超时"、"认证失败")
- 避免单设备错误导致整个批量任务中断
- 错误信息同时输出到控制台(实时查看)和日志文件(事后分析)
5. 批量配置控制函数(batch_configure_switches)
该函数负责批量任务的调度、并发控制、结果统计和最终报告生成。
5.1 IP 列表生成
python
运行
ip_list = [f"172.21.0.{i}" for i in range(85, 115)] # 生成172.21.0.85-114(共30台)
通过列表推导式快速生成目标设备 IP 列表,实际使用中可改为从文件(如ips.txt)读取,提升灵活性。
5.2 并发任务调度
python
运行
with concurrent.futures.ThreadPoolExecutor(
max_workers=concurrent_num,
thread_name_prefix="SwitchConfig"
) as executor:
# 提交所有任务
futures = {executor.submit(configure_switch, ip): ip for ip in ip_list}
# 遍历任务结果
for future in concurrent.futures.as_completed(futures):
# 处理单任务结果
线程池优势:
ThreadPoolExecutor自动管理线程创建和销毁,避免手动管理线程的复杂性max_workers控制并发数量(示例中为 10),避免并发过高导致设备或网络过载as_completed按任务完成顺序处理结果,而非提交顺序,提升效率
5.3 结果统计与报告
python
运行
# 统计结果
success_count = 0
fail_count = 0
fail_details = []
# 最终报告
print(f"批量并发配置完成!总耗时: {duration}")
print(f"成功: {success_count} 台 | 失败: {fail_count} 台 | 总计: {total} 台")
if fail_details:
print("失败设备及原因:")
for detail in fail_details:
print(f" - {detail}")
通过线程锁保护的统计变量,最终生成清晰的结果报告,包括:
- 总耗时(评估效率)
- 成功 / 失败数量(整体结果)
- 失败详情(便于针对性排查)
6. 主程序入口
python
运行
if __name__ == "__main__":
batch_configure_switches(concurrent_num=10)
当脚本直接运行时,调用批量配置函数,设置并发数为 10(可根据设备性能和网络状况调整)。
脚本优势与扩展建议
优势总结
- 高效性:通过多线程并发,大幅缩短批量配置时间(30 台设备耗时接近单台配置时间)
- 可靠性:完善的异常处理和日志记录,确保操作可追溯、问题可排查
- 安全性:线程锁保证统计准确,
with语句确保连接安全关闭 - 易用性:模块化设计,修改
config_commands或ip_list即可适配不同场景
扩展建议
- 动态参数化:从配置文件(如
config.yaml)读取设备信息、命令列表,避免硬编码 - 配置备份:在配置前自动备份设备当前配置(
show running-config),便于回滚 - 结果验证:配置后自动执行验证命令(如
show username),确认配置生效 - 进度展示:添加进度条(如
tqdm库),直观展示批量任务进度 - 邮件通知:任务完成后自动发送结果邮件,适合无人值守场景
总结
该脚本基于netmiko和多线程技术,实现了交换机批量配置的自动化,兼顾了效率、可靠性和可维护性。无论是中小企业的几十台设备,还是大型企业的上百台设备,都能通过该脚本显著降低运维成本,减少人为错误。
网络自动化的核心是 "解放双手,聚焦决策",这个脚本正是这一理念的实践 —— 将重复的配置工作交给程序,运维人员只需关注配置策略和结果分析。

624

被折叠的 条评论
为什么被折叠?



