“小时级”到“分钟级”!这招,一键完成多台交换机基础设置

整体操作流程总览

前期准备 → 创建3个核心文件 → 安装依赖 → 单台测试 → 全量执行 → 验证结果 → 问题排查

第一步:前期准备工作(必做,避免后续踩坑)

1.1 硬件 & 网络准备

    1. 将运维电脑接入交换机的管理 VLAN(通常是 VLAN 1 或专用运维 VLAN)
    2. 在运维电脑上打开「命令提示符(Windows)」或「终端(Linux/macOS)」,ping 每台交换机的管理 IP(以 192.168.1.101 为例):
      # Windows/Linux/macOS通用命令
      ping 192.168.1.101
      
    3. 要求:ping 丢包率为 0,延迟稳定(避免脚本连接超时)确认运维电脑与所有目标交换机网络可达
    • 确认交换机已开启 Telnet/SSH 服务(华为交换机默认可能开启 Telnet,优先用 SSH):
    • 若未开启,先手动登录 1 台交换机配置基础远程访问(后续脚本会统一优化为 SSH):
      # 华为交换机手动配置(临时,用于脚本接入)
      sys
      user-interface vty 0 4
      authentication-mode password
      set authentication password cipher Admin@123
      protocol inbound telnet ssh  # 同时开启Telnet和SSH,方便脚本连接
      quit
      save
      y
      

1.2 软件环境准备(安装 Python)

下载 Python:

    1. 访问官网 https://www.python.org/downloads/,下载对应系统版本(Windows 选 3.9~3.11,兼容性最好)
    2. 安装步骤(重点!):
      • Windows:勾选「Add Python to PATH」(添加到系统环境变量,新手必选),然后点击「Install Now」,后续默认下一步即可
      • Linux/macOS:系统通常自带 Python3,无需额外安装,可通过 python3 --version 验证版本
  • 验证 Python 安装成功:
    1. 打开「命令提示符(Windows)」或「终端(Linux/macOS)」
    2. 输入命令验证:
      # Windows
      python --version
      pip --version
      
      # Linux/macOS
      python3 --version
      pip3 --version
      
    3. 若显示版本号(如 Python 3.10.12),说明安装成功;若提示「不是内部或外部命令」,则是环境变量未配置,需重新安装并勾选「Add Python to PATH」

1.3 工具准备(文件编辑工具)

推荐使用以下工具创建 / 编辑文件(避免记事本的格式问题):
  • 新手友好:Notepad++(Windows)、TextEdit(macOS,需切换为「纯文本模式」)
  • 专业优选:VS Code(跨平台,免费,可安装 Python 插件高亮语法)
注意:所有文件必须保存在同一个文件夹下(例如新建一个文件夹「Switch_Deploy」,后续 3 个核心文件都放在这里)

第二步:创建核心文件 1 - 设备清单「devices.csv」

2.1 具体创建步骤

  1. 打开你选择的编辑工具(以 Notepad++ 为例)
  2. 新建一个空白文件,输入以下内容(严格按照格式,英文逗号分隔,无多余空格):
    ip,username,password,hostname,vlan10_ip
    192.168.1.101,admin,Admin@123,SW-Core-01,192.168.10.1
    192.168.1.102,admin,Admin@123,SW-ACC-01,192.168.10.2
    192.168.1.103,admin,Admin@123,SW-ACC-02,192.168.10.3
    
  3. 保存文件:
    • 点击「文件」→「保存」,路径选择第一步新建的「Switch_Deploy」文件夹
    • 文件名填写「devices.csv」(后缀必须是.csv,不是.txt)
    • 编码选择「UTF-8」(关键!避免中文设备名乱码)
    • 保存类型选择「所有文件」
字段名 含义 修改注意事项
ip 交换机管理 IP 地址 必须是运维电脑能 ping 通的地址,不可重复
username 交换机登录账号 需具备管理员权限(level 3),建议统一运维账号
password 交换机登录密码 注意特殊字符(如 @、#)无需转义,直接填写
hostname 交换机设备名称(sysname) 避免中文和特殊字符,用「-」或「_」分隔
vlan10_ip VLAN 10 的接口 IP 地址 格式为「xxx.xxx.xxx.xxx」,不可与其他设备冲突

2.3 补充:用 Excel 创建 CSV(更适合大量设备)

若你有 50 台交换机,用 Excel 编辑更高效,步骤如下:
  1. 打开 Excel,新建空白表格
  2. 第一行输入字段名(ip、username、password、hostname、vlan10_ip),后续行填写每台交换机的信息
  3. 点击「文件」→「另存为」,选择保存路径为「Switch_Deploy」
  4. 保存类型选择「CSV (逗号分隔)(*.csv)」,编码选择「UTF-8」
  5. 弹出提示框时,直接点击「确定」(无需保留 Excel 格式)

第三步:创建核心文件 2 - 配置模板「base_config.txt」

3.1 具体创建步骤

  1. 打开编辑工具,新建空白文件
  2. 粘贴以下优化后的配置模板(已解决华为交换机 SSH 开启、保存交互等问题):
    sysname {{ hostname }}
    vlan batch 10 20 30
    interface vlanif 10
    ip address {{ vlan10_ip }} 255.255.255.0
    quit
    # 开启SSH服务(华为部分型号默认关闭,避免配置失败)
    ssh server enable
    # 配置AAA运维账号
    aaa
    local-user netops password cipher Ops@2025
    local-user netops service-type ssh terminal
    local-user netops level 3
    quit
    # 配置VTY界面,仅允许SSH登录,使用AAA认证
    user-interface vty 0 4
    authentication-mode aaa
    protocol inbound ssh  # 关闭Telnet,仅保留SSH(安全合规)
    quit
    # 配置SNMP(网络管理必备)
    snmp-agent
    snmp-agent sys-info version v2c
    snmp-agent community read public
    snmp-agent target-host trap address udp-domain 10.10.100.10 params securityname public
    quit
    
    • 保存文件:
      • 路径:「Switch_Deploy」文件夹
      • 文件名:「base_config.txt」(后缀.txt)
      • 编码:「UTF-8」
      • 保存类型:「所有文件」

3.2 模板关键说明

  • {{ 变量名 }}:Jinja2 模板的变量标识,会被「devices.csv」中的对应字段值替换(例如{{ hostname }}会被替换为「SW-Core-01」)
  • 注释行(# 开头):仅用于说明,脚本运行时会自动忽略,不影响设备配置
  • 末尾的quit:退出系统视图,回到用户视图,为后续脚本执行「save」命令做好准备

第四步:创建核心文件 3 - Python 脚本「deploy_switches.py」

4.1 具体创建步骤

  1. 打开编辑工具,新建空白文件
  2. 粘贴以下修正后的完整脚本(已解决缩进、编码、保存交互等问题):
    import csv
    from netmiko import ConnectHandler
    from jinja2 import Template
    import logging
    
    # 启用日志功能,配置日志格式(包含时间、级别、内容,方便追溯问题)
    logging.basicConfig(
        filename='deploy.log',
        level=logging.INFO,
        format='%(asctime)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    
    def load_devices(file):
        """加载devices.csv文件,返回设备信息列表"""
        try:
            with open(file, 'r', encoding='utf-8') as f:
                # csv.DictReader会将第一行作为字段名,后续行作为值,返回字典列表
                return list(csv.DictReader(f))
        except FileNotFoundError:
            logging.error(f"❌ 设备清单文件 {file} 未找到,请检查文件路径")
            print(f"❌ ERROR: 设备清单文件 {file} 未找到,请检查文件路径")
            exit(1)
    
    def render_config(template_file, data):
        """渲染Jinja2模板,返回格式化后的配置命令列表"""
        try:
            with open(template_file, 'r', encoding='utf-8') as f:
                tmpl_content = f.read()
            # 初始化Jinja2模板并渲染变量
            tmpl = Template(tmpl_content)
            # 渲染后按行分割,返回命令列表(适配netmiko的send_config_set方法)
            return tmpl.render(**data).splitlines()
        except FileNotFoundError:
            logging.error(f"❌ 配置模板文件 {template_file} 未找到,请检查文件路径")
            print(f"❌ ERROR: 配置模板文件 {template_file} 未找到,请检查文件路径")
            exit(1)
    
    def deploy_to_device(device_info):
        """向单台交换机推送配置并保存"""
        # 配置netmiko设备连接参数
        device = {
            'device_type': 'huawei',  # 华为交换机设备类型(固定值,支持大多数华为型号)
            'host': device_info['ip'],  # 交换机管理IP
            'username': device_info['username'],  # 登录账号
            'password': device_info['password'],  # 登录密码
            'timeout': 30,  # 连接超时时间(30秒,适配配置较多的场景)
            'session_log': f"{device_info['ip']}_session.log"  # 可选:生成单台设备的详细交互日志
        }
    
        try:
            # 1. 建立与交换机的SSH/Telnet连接
            print(f"🔧 正在连接 {device_info['ip']}({device_info['hostname']})...")
            conn = ConnectHandler(**device)
    
            # 2. 渲染配置模板,获取待执行的配置命令
            config_set = render_config('base_config.txt', device_info)
    
            # 3. 推送配置命令到交换机(配置模式)
            print(f"🔧 正在向 {device_info['ip']} 推送配置...")
            output = conn.send_config_set(config_set)
    
            # 4. 执行保存命令,模拟人工输入「y」确认保存(华为设备必备)
            print(f"🔧 正在保存 {device_info['ip']} 配置...")
            save_output = conn.send_command_timing("save")
            # 判断设备是否需要确认保存(不同华为型号提示语可能不同)
            if "Are you sure to save" in save_output or "confirm" in save_output or "Y/N" in save_output:
                save_confirm = conn.send_command_timing("y")
    
            # 5. 断开与交换机的连接
            conn.disconnect()
    
            # 6. 记录成功日志并打印结果
            success_msg = f"✅ {device_info['ip']}({device_info['hostname']})配置成功并保存"
            logging.info(success_msg)
            print(success_msg + "\n")
    
        except Exception as e:
            # 7. 记录失败日志并打印错误信息
            error_msg = f"❌ {device_info['ip']} 配置失败: {str(e)}"
            logging.error(error_msg, exc_info=True)  # exc_info=True:记录完整异常堆栈,方便排查
            print(error_msg + "\n")
    
    if __name__ == "__main__":
        """脚本入口,批量加载设备并执行配置"""
        print("=====================================")
        print("开始批量配置华为交换机(请耐心等待)")
        print("=====================================\n")
        # 加载所有设备信息
        devices = load_devices('devices.csv')
        # 遍历每台设备,执行配置
        for dev in devices:
            deploy_to_device(dev)
        # 批量配置完成提示
        print("=====================================")
        print("批量配置执行完毕,详情请查看 deploy.log 文件")
        print("=====================================")
    
  3. 保存文件:
    • 路径:「Switch_Deploy」文件夹
    • 文件名:「deploy_switches.py」(后缀.py)
    • 编码:「UTF-8」
    • 保存类型:「所有文件」

4.2 脚本文件验证

  • 确认文件结构:此时「Switch_Deploy」文件夹下应有 3 个文件,结构如下:
    plaintext
    Switch_Deploy/
    ├─ devices.csv
    ├─ base_config.txt
    └─ deploy_switches.py
    

第五步:安装脚本依赖库(netmiko & jinja2)

5.1 具体操作步骤

  1. 打开「命令提示符(Windows)」或「终端(Linux/macOS)」
  2. 切换到「Switch_Deploy」文件夹的路径(关键!例如文件夹在桌面,命令如下):
    # Windows示例(桌面文件夹)
    cd Desktop\Switch_Deploy
    
    # Linux/macOS示例(桌面文件夹)
    cd ~/Desktop/Switch_Deploy
    
    • 验证路径是否正确:输入 dir(Windows)或 ls(Linux/macOS),能看到 3 个核心文件即说明路径正确
  3. 执行安装命令(根据 Python 版本选择):
    # Windows(Python 3.x)
    pip install netmiko jinja2
    
    # 若提示pip不是内部命令,尝试用
    python -m pip install netmiko jinja2
    
    # Linux/macOS(Python 3.x)
    pip3 install netmiko jinja2
    
  4. 安装成功标识:终端显示「Successfully installed netmiko-x.x.x jinja2-x.x.x」(无红色报错)
  5. 常见安装问题解决:
    • 问题 1:安装缓慢 / 超时 → 切换国内镜像源加速
      # 临时使用阿里云镜像源(Windows/Linux/macOS通用)
      pip install netmiko jinja2 -i https://mirrors.aliyun.com/pypi/simple/
      
    • 问题 2:权限不足(Linux/macOS)→ 加 sudo 提升权限
      sudo pip3 install netmiko jinja2
      

第六步:单台设备测试(必做!避免批量翻车)

6.1 测试准备

  1. 编辑「devices.csv」,只保留 1 台交换机的信息(删除其他行,仅保留表头和 1 台设备):
    rname,password,hostname,vlan10_ip
    192.168.1.101,admin,Admin@123,SW-Core-01,192.168.10.1
    
  2. 保存「devices.csv」,确保修改生效

6.2 运行脚本

  1. 保持终端在「Switch_Deploy」文件夹路径下,执行运行命令:
    # Windows
    python deploy_switches.py
    
    # Linux/macOS
    python3 deploy_switches.py
    
  2. 正常运行输出(分步打印,最终显示成功):
    =====================================
    开始批量配置华为交换机(请耐心等待)
    =====================================
    
    🔧 正在连接 192.168.1.101(SW-Core-01)...
    🔧 正在向 192.168.1.101 推送配置...
    🔧 正在保存 192.168.1.101 配置...
    ✅ 192.168.1.101(SW-Core-01)配置成功并保存
    
    =====================================
    批量配置执行完毕,详情请查看 deploy.log 文件
    =====================================
    

6.3 验证配置是否生效

  1. 手动登录测试交换机(192.168.1.101),执行以下命令验证配置:
    # 1. 验证设备名称
    display sysname
    # 预期结果:SW-Core-01
    
    # 2. 验证VLAN配置
    display vlan brief
    # 预期结果:存在VLAN 10、20、30
    
    # 3. 验证VLAN 10 IP
    display interface vlanif 10
    # 预期结果:IP地址为 192.168.10.1/24
    
    # 4. 验证SSH服务和运维账号
    display ssh server
    # 预期结果:SSH服务器状态为 Enable
    display local-user netops
    # 预期结果:账号存在,服务类型为 SSH/Terminal,级别为 3
    
    # 5. 验证配置是否保存
    display saved-configuration | include sysname
    # 预期结果:能查到 sysname SW-Core-01(说明配置已保存到闪存)
    
  2. 若所有验证都符合预期,说明脚本和模板无问题,可进行全量执行;若不符合,查看「deploy.log」和「192.168.1.101_session.log」排查问题

第七步:全量执行批量配置(50 台交换机)

7.1 全量准备

  1. 编辑「devices.csv」,恢复所有 50 台交换机的信息(补充完整 IP、hostname 等字段)
  2. 保存「devices.csv」,再次确认所有设备的 IP 都能 ping 通
  3. 确保运维电脑网络稳定,避免中途断网

7.2 运行脚本

  1. 终端切换到「Switch_Deploy」文件夹,执行运行命令:
    # Windows
    python deploy_switches.py
    
    # Linux/macOS
    python3 deploy_switches.py
    
  2. 运行过程中:
    • 脚本会逐台设备执行,每台设备执行完成后会打印结果
    • 若某台设备失败,脚本不会中断,会继续执行下一台(异常处理机制)
    • 50 台设备约 20 分钟完成(与网络速度、设备配置复杂度相关)

7.3 查看执行结果

  1. 终端输出:可快速看到哪些设备成功、哪些失败
  2. 日志文件「deploy.log」:
    • 用 Notepad++/VS Code 打开,包含每台设备的执行时间、结果
    • 失败设备会记录详细异常信息,方便后续排查
  3. 单台设备日志「xxx.xxx.xxx.xxx_session.log」:
    • 若某台设备配置异常,可打开对应 IP 的 session 日志,查看完整的设备交互过程,定位具体报错命令

第八步:后续验证与问题排查

8.1 批量验证策略

  1. 抽样验证:随机选择 5~10 台设备,手动登录执行第六步的验证命令,确认配置生效且保存
  2. 批量查询(进阶):若有网络管理平台,可批量查询设备的 sysname、VLAN、SSH 状态,提高验证效率
  3. 安全合规验证:确认所有设备都关闭了 Telnet,仅开启 SSH(符合安全要求)

8.2 常见问题排查清单

问题现象 排查方向
提示「Connection refused」(连接被拒绝) 1. 交换机未开启 SSH/Telnet 服务

2. 交换机管理 IP 不可达

3. 交换机端口被防火墙拦截

提示「Authentication failed」(认证失败) 1. 账号 / 密码填写错误

2. 账号无管理员权限

3. 账号被锁定(多次输错密码)

配置推送成功,但未保存 1. 脚本中「save」命令执行异常

2. 交换机闪存不足,无法保存配置

3. 账号无保存权限

部分 VLAN 未创建成功 1. 配置模板中 VLAN 命令格式错误

2. 交换机型号不支持「vlan batch」命令(老旧型号)

日志文件中文乱码 1. 文件编码不是 UTF-8

2. 编辑工具未设置 UTF-8 编码打开

总结

  1. 整个操作的核心是「3 个核心文件 + 单台测试」,单台测试通过后,全量执行的风险会大幅降低
  2. 新手重点关注「文件路径、编码格式、网络可达性」,这三个是最容易踩坑的点
  3. 50 台设备批量配置完成后,可将「Switch_Deploy」文件夹备份,后续新建机房、灾备恢复时可直接修改复用
阅读剩余
THE END
阿里云ECS特惠活动
阿里云ECS服务器 - 限时特惠活动

云服务器爆款直降90%

新客首单¥68起 | 人人可享99元套餐,续费同价 | u2a指定配置低至2.5折1年,立即选购享更多福利!

新客首单¥68起
人人可享99元套餐
弹性计费
7x24小时售后
立即查看活动详情
阿里云ECS服务器特惠活动