本文目录导读:

- 使用 Python + Netmiko (推荐,适用于华为、思科、H3C等主流厂商)
- 使用 Shell + SSH + Expect (适用于 Linux 环境,无需安装 Python 库)
- 使用 Ansible (自动化运维利器,适合大规模集群)
- 使用厂商 API (最新趋势)
- 核心注意事项
- 总结与选择建议
当然可以,批量创建、修改或删除 VLAN 是网络运维中的高频需求,完全可以通过脚本实现自动化,从而避免手动逐条配置的低效与出错风险。
核心思路是利用网络设备的命令行接口(CLI),通过脚本(如 Python、Shell、Expect、Ansible)登录设备并执行批量命令。
下面提供几种主流厂商及通用场景的脚本方案。
使用 Python + Netmiko (推荐,适用于华为、思科、H3C等主流厂商)
Netmiko 是专门用于网络设备 SSH 连接的 Python 库,支持多厂商,它简化了 SSH 登录和命令执行的流程。
场景: 在华为交换机上批量创建 VLAN 10-50,并添加描述。
from netmiko import ConnectHandler
# 设备信息(请根据实际修改)
device = {
'device_type': 'huawei', # 思科用 'cisco_ios', H3C用 'hp_comware'
'host': '192.168.1.100',
'username': 'admin',
'password': 'your_password',
'port': 22,
'secret': 'enable_password' # 思科可能需要enable密码
}
# 连接设备
try:
connection = ConnectHandler(**device)
print(f"成功连接到 {device['host']}")
# 进入系统视图(华为/H3C)或全局配置模式(思科)
connection.send_command("system-view", expect_string=r'\[.*\]') # 华为
# 如果是思科,使用:connection.enable() connection.config_mode()
# 批量创建VLAN 10 到 50
vlan_start = 10
vlan_end = 50
for vlan_id in range(vlan_start, vlan_end + 1):
command = f"vlan {vlan_id}"
connection.send_command(command, expect_string=r'\[.*\]')
description = f"VLAN_{vlan_id}_Auto"
connection.send_command(f"description {description}", expect_string=r'\[.*\]')
# 退回到系统视图,准备创建下一个VLAN
connection.send_command("quit", expect_string=r'\[.*\]')
print(f"已批量创建 VLAN {vlan_start} 到 {vlan_end}")
# 保存配置(华为:save,思科:write memory)
connection.send_command("save", expect_string=r'\[Y/N\]')
connection.send_command("Y", expect_string=r'.*>')
print("配置已保存。")
connection.disconnect()
except Exception as e:
print(f"发生错误: {e}")
优势:
- 跨厂商:通过修改
device_type参数即可适配不同品牌。 - 健壮性:内置了超时、重试、正则匹配等待机制。
- 可扩展:可轻松加入检查、日志、报表功能。
使用 Shell + SSH + Expect (适用于 Linux 环境,无需安装 Python 库)
Expect 可以模拟交互式登录,适合纯命令行环境。
场景: 在 Cisco 交换机上批量删除 VLAN 60-100。
#!/usr/bin/expect -f
set host "192.168.1.200"
set username "admin"
set password "cisco123"
set enable_pwd "enable123"
# 启动 SSH 会话
spawn ssh $username@$host
expect "assword:"
send "$password\r"
expect ">"
send "enable\r"
expect "assword:"
send "$enable_pwd\r"
expect "#"
send "configure terminal\r"
# 循环删除 VLAN 60 到 100
for {set i 60} {$i <= 100} {incr i} {
expect "(config)#"
send "no vlan $i\r"
}
expect "(config)#"
send "exit\r"
expect "#"
send "write memory\r"
expect "#"
send "exit\r"
expect eof
劣势:
- 脚本可读性较差,调试困难。
- 对命令输出变化的适应性差(比如提示符改变可能导致脚本卡住)。
使用 Ansible (自动化运维利器,适合大规模集群)
Ansible 是自动化配置管理工具,使用 YAML 编写 Playbook,对于网络设备,需要安装 ansible.netcommon 和对应厂商的 Collection(如 cisco.ios、huawei.cloud)。
场景: 在 3 台 Cisco 交换机上批量创建 VLAN 10, 100, 200。
---
- name: 批量配置 Cisco VLAN
hosts: cisco_switches # 定义主机组
gather_facts: no
tasks:
- name: 创建 VLAN 10, 100, 200
cisco.ios.ios_vlans:
config:
- vlan_id: 10
name: Sales_Dept
- vlan_id: 100
name: R&D_Dept
- vlan_id: 200
name: Guest_Network
state: merged # merged 表示创建或更新,replaced 替换,deleted 删除
register: result
- name: 显示配置结果
debug:
var: result.commands
你需要一个 inventory 文件(定义设备 IP 和凭证)和 Ansible 控制节点。
使用厂商 API (最新趋势)
华为、思科、Aruba 等主流厂商的较新设备都支持 RESTCONF/NETCONF 协议,你可以通过 Python requests 库发送结构化的 XML/JSON 数据,这是最“高级”和规范的做法。
import requests import json # 华为 iMaster NCE-Campus 或 NETCONF 接口示例 # url = "https://192.168.1.100:8443/restconf/data/vlan" # 需要处理 HTTP 头部、认证、证书等,代码略复杂
核心注意事项
-
安全第一:绝对不要在脚本中硬编码密码! 建议使用:
- 环境变量(
os.environ.get('SSH_PASSWORD'))。 - Ansible Vault 加密。
- 专门的密钥管理工具(如 HashiCorp Vault)。
- 环境变量(
-
预检查:在批量执行前,建议先对一台设备进行测试,确认命令效果正确。
-
异常处理:务必加入
try-except,并记录日志,如果某条命令执行失败,脚本应该能够优雅地跳过或停止,而不是造成配置混乱。 -
配置备份:在批量修改或删除 VLAN 之前,强烈建议先执行
display current-configuration | include vlan(华为)或show running-config | include interface Vlan(思科)等命令,将当前 VLAN 配置备份到本地文件,以便回滚。 -
分步执行:如果脚本执行过程中断(网络波动、设备CPU过高),你需要有回滚方案,最好将脚本设计为幂等的(即多次执行结果相同),或者使用类似“事务”的机制(如先配置,最后统一
commit)。
总结与选择建议
| 方案 | 适用场景 | 学习成本 | 推荐度 |
|---|---|---|---|
| Python + Netmiko | 日常运维、中小规模批量、需快速开发 | 中 | ★★★★★ (首选) |
| Shell + Expect | 纯Linux环境、无Python库、临时救急 | 低 | |
| Ansible | 大规模集群、自动化平台、需与CI/CD集成 | 高 | ★★★★☆ (大规模首选) |
| Restconf/NETCONF | 新设备、数据中心、需与编排平台集成 | 高 | ★★★★☆ (未来趋势) |
直接推荐:如果你只是想快速完成一次性的批量VLAN操作,并且网络设备是华为、思科或H3C,直接使用 Python + Netmiko 方案,它是最平衡“开发效率”、“可靠性”和“可维护性”的选择。
如果你能提供设备厂商、型号、IOS版本以及VLAN的范围和具体配置命令,我可以为你提供更精准的片段。