详解批量交换机(锐捷)配置自动化脚本:从单设备操作到并发批量处理

详解批量交换机(锐捷)配置自动化脚本:从单设备操作到并发批量处理

在网络运维中,批量配置设备是常见需求。手动逐台操作不仅效率低下,还容易出错。本文将详细解析一个基于 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级别(包含INFOWARNINGERROR),既记录关键操作,又避免冗余
  • 日志格式:包含时间(asctime)、级别(levelname)、消息(message),便于定位问题
  • 编码设置utf-8编码确保中文日志正常显示(如设备中文提示信息)

3. 线程安全控制模块

python

运行

lock = threading.Lock()

为什么需要线程锁?在多线程场景下,多个线程可能同时修改共享变量(如脚本中的success_countfail_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_typenetmiko支持的设备类型(如cisco_ioshuawei_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)

流程解析

  1. 连接管理:使用with语句自动管理连接生命周期(无需手动conn.disconnect()
  2. 特权模式:网络设备配置通常需要进入特权模式(enable),通过conn.enable()实现
  3. 配置下发send_config_set自动进入全局配置模式(configure terminal),批量执行命令
  4. 配置保存:通过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(可根据设备性能和网络状况调整)。

脚本优势与扩展建议

优势总结

  1. 高效性:通过多线程并发,大幅缩短批量配置时间(30 台设备耗时接近单台配置时间)
  2. 可靠性:完善的异常处理和日志记录,确保操作可追溯、问题可排查
  3. 安全性:线程锁保证统计准确,with语句确保连接安全关闭
  4. 易用性:模块化设计,修改config_commandsip_list即可适配不同场景

扩展建议

  1. 动态参数化:从配置文件(如config.yaml)读取设备信息、命令列表,避免硬编码
  2. 配置备份:在配置前自动备份设备当前配置(show running-config),便于回滚
  3. 结果验证:配置后自动执行验证命令(如show username),确认配置生效
  4. 进度展示:添加进度条(如tqdm库),直观展示批量任务进度
  5. 邮件通知:任务完成后自动发送结果邮件,适合无人值守场景

总结

该脚本基于netmiko和多线程技术,实现了交换机批量配置的自动化,兼顾了效率、可靠性和可维护性。无论是中小企业的几十台设备,还是大型企业的上百台设备,都能通过该脚本显著降低运维成本,减少人为错误。

网络自动化的核心是 "解放双手,聚焦决策",这个脚本正是这一理念的实践 —— 将重复的配置工作交给程序,运维人员只需关注配置策略和结果分析。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值