“小时级”到“分钟级”!这招,一键完成多台交换机基础设置
整体操作流程总览
前期准备 → 创建3个核心文件 → 安装依赖 → 单台测试 → 全量执行 → 验证结果 → 问题排查
第一步:前期准备工作(必做,避免后续踩坑)
1.1 硬件 & 网络准备
-
- 将运维电脑接入交换机的管理 VLAN(通常是 VLAN 1 或专用运维 VLAN)
- 在运维电脑上打开「命令提示符(Windows)」或「终端(Linux/macOS)」,ping 每台交换机的管理 IP(以 192.168.1.101 为例):
# Windows/Linux/macOS通用命令 ping 192.168.1.101 - 要求: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:
-
- 访问官网 https://www.python.org/downloads/,下载对应系统版本(Windows 选 3.9~3.11,兼容性最好)
- 安装步骤(重点!):
- Windows:勾选「Add Python to PATH」(添加到系统环境变量,新手必选),然后点击「Install Now」,后续默认下一步即可
- Linux/macOS:系统通常自带 Python3,无需额外安装,可通过
python3 --version验证版本
- 验证 Python 安装成功:
- 打开「命令提示符(Windows)」或「终端(Linux/macOS)」
- 输入命令验证:
# Windows python --version pip --version # Linux/macOS python3 --version pip3 --version - 若显示版本号(如 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 具体创建步骤
- 打开你选择的编辑工具(以 Notepad++ 为例)
- 新建一个空白文件,输入以下内容(严格按照格式,英文逗号分隔,无多余空格):
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 - 保存文件:
- 点击「文件」→「保存」,路径选择第一步新建的「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 编辑更高效,步骤如下:
- 打开 Excel,新建空白表格
- 第一行输入字段名(ip、username、password、hostname、vlan10_ip),后续行填写每台交换机的信息
- 点击「文件」→「另存为」,选择保存路径为「Switch_Deploy」
- 保存类型选择「CSV (逗号分隔)(*.csv)」,编码选择「UTF-8」
- 弹出提示框时,直接点击「确定」(无需保留 Excel 格式)
第三步:创建核心文件 2 - 配置模板「base_config.txt」
3.1 具体创建步骤
- 打开编辑工具,新建空白文件
- 粘贴以下优化后的配置模板(已解决华为交换机 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 具体创建步骤
- 打开编辑工具,新建空白文件
- 粘贴以下修正后的完整脚本(已解决缩进、编码、保存交互等问题):
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("=====================================") - 保存文件:
- 路径:「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 具体操作步骤
- 打开「命令提示符(Windows)」或「终端(Linux/macOS)」
- 切换到「Switch_Deploy」文件夹的路径(关键!例如文件夹在桌面,命令如下):
# Windows示例(桌面文件夹) cd Desktop\Switch_Deploy # Linux/macOS示例(桌面文件夹) cd ~/Desktop/Switch_Deploy- 验证路径是否正确:输入
dir(Windows)或ls(Linux/macOS),能看到 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 - 安装成功标识:终端显示「Successfully installed netmiko-x.x.x jinja2-x.x.x」(无红色报错)
- 常见安装问题解决:
- 问题 1:安装缓慢 / 超时 → 切换国内镜像源加速
# 临时使用阿里云镜像源(Windows/Linux/macOS通用) pip install netmiko jinja2 -i https://mirrors.aliyun.com/pypi/simple/ - 问题 2:权限不足(Linux/macOS)→ 加 sudo 提升权限
sudo pip3 install netmiko jinja2
- 问题 1:安装缓慢 / 超时 → 切换国内镜像源加速
第六步:单台设备测试(必做!避免批量翻车)
6.1 测试准备
- 编辑「devices.csv」,只保留 1 台交换机的信息(删除其他行,仅保留表头和 1 台设备):
rname,password,hostname,vlan10_ip 192.168.1.101,admin,Admin@123,SW-Core-01,192.168.10.1 - 保存「devices.csv」,确保修改生效
6.2 运行脚本
- 保持终端在「Switch_Deploy」文件夹路径下,执行运行命令:
# Windows python deploy_switches.py # Linux/macOS python3 deploy_switches.py - 正常运行输出(分步打印,最终显示成功):
===================================== 开始批量配置华为交换机(请耐心等待) ===================================== 🔧 正在连接 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 验证配置是否生效
- 手动登录测试交换机(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(说明配置已保存到闪存) - 若所有验证都符合预期,说明脚本和模板无问题,可进行全量执行;若不符合,查看「deploy.log」和「192.168.1.101_session.log」排查问题
第七步:全量执行批量配置(50 台交换机)
7.1 全量准备
- 编辑「devices.csv」,恢复所有 50 台交换机的信息(补充完整 IP、hostname 等字段)
- 保存「devices.csv」,再次确认所有设备的 IP 都能 ping 通
- 确保运维电脑网络稳定,避免中途断网
7.2 运行脚本
- 终端切换到「Switch_Deploy」文件夹,执行运行命令:
# Windows python deploy_switches.py # Linux/macOS python3 deploy_switches.py - 运行过程中:
- 脚本会逐台设备执行,每台设备执行完成后会打印结果
- 若某台设备失败,脚本不会中断,会继续执行下一台(异常处理机制)
- 50 台设备约 20 分钟完成(与网络速度、设备配置复杂度相关)
7.3 查看执行结果
- 终端输出:可快速看到哪些设备成功、哪些失败
- 日志文件「deploy.log」:
- 用 Notepad++/VS Code 打开,包含每台设备的执行时间、结果
- 失败设备会记录详细异常信息,方便后续排查
- 单台设备日志「xxx.xxx.xxx.xxx_session.log」:
- 若某台设备配置异常,可打开对应 IP 的 session 日志,查看完整的设备交互过程,定位具体报错命令
第八步:后续验证与问题排查
8.1 批量验证策略
- 抽样验证:随机选择 5~10 台设备,手动登录执行第六步的验证命令,确认配置生效且保存
- 批量查询(进阶):若有网络管理平台,可批量查询设备的 sysname、VLAN、SSH 状态,提高验证效率
- 安全合规验证:确认所有设备都关闭了 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 编码打开 |
总结
- 整个操作的核心是「3 个核心文件 + 单台测试」,单台测试通过后,全量执行的风险会大幅降低
- 新手重点关注「文件路径、编码格式、网络可达性」,这三个是最容易踩坑的点
- 50 台设备批量配置完成后,可将「Switch_Deploy」文件夹备份,后续新建机房、灾备恢复时可直接修改复用
阅读剩余
版权声明:
作者:SE_Tianle
链接:https://www.cnesa.cn/10250.html
文章版权归作者所有,未经允许请勿转载。
THE END
阿里云ECS服务器 - 限时特惠活动
云服务器爆款直降90%
新客首单¥68起 | 人人可享99元套餐,续费同价 | u2a指定配置低至2.5折1年,立即选购享更多福利!
新客首单¥68起
人人可享99元套餐
弹性计费
7x24小时售后