中兴交换机自动化配置脚本实战指南
1. 中兴交换机自动化配置脚本入门指南
第一次接触中兴交换机自动化配置脚本时,我完全被那些复杂的命令行吓到了。但经过几个项目的实战,我发现这玩意儿简直就是网络工程师的"瑞士军刀"。想象一下,你面前摆着50台需要配置的交换机,手动操作不仅耗时还容易出错,而脚本能让你在喝杯咖啡的功夫就搞定所有设备。
中兴交换机的CLI配置界面虽然功能强大,但重复操作确实让人头疼。比如每次新设备上线都要配置VLAN、端口聚合、安全策略这些基础内容。后来我发现,把这些固定操作写成脚本,效率能提升至少10倍。
先来看个最简单的例子 - 批量修改交换机主机名。传统方式是一台台登录设备,输入"configure terminal"进入配置模式,再输入"hostname 新名称"。而用脚本可以这样写:
#!/bin/bash for ip in 192.168.1.{100..150} do ssh admin@$ip <<EOF configure terminal hostname ZXR10-$ip exit write EOF done这个脚本会批量登录192.168.1.100到150的所有设备,把主机名改成ZXR10-IP地址的格式。是不是比手动操作快多了?
2. 基础配置脚本编写实战
2.1 VLAN批量配置技巧
在实际项目中,VLAN配置是最常见的需求之一。我遇到过要给20台交换机配置相同VLAN的情况,手动操作简直要命。后来我总结出一个万能模板:
#!/bin/bash # VLAN配置脚本 vlan_list="100:管理 200:业务 300:存储" # 定义VLAN及描述 for vlan in $vlan_list do vlan_id=${vlan%:*} vlan_name=${vlan#*:} echo "vlan $vlan_id" echo " name $vlan_name" echo "exit" done > vlan_config.txt这个脚本会生成一个包含所有VLAN配置的文本文件,然后你可以用expect或ansible批量推送到交换机。我特别喜欢用冒号分隔VLAN ID和描述名的方式,清晰又方便修改。
2.2 端口安全配置自动化
端口安全是网络运维的重中之重。有次客户要求在所有接入端口启用端口安全,限制每个端口只能学习1个MAC地址。手动配置?别开玩笑了!我写了这样的脚本:
import paramiko def config_port_security(ip, username, password): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip, username=username, password=password) shell = ssh.invoke_shell() shell.send('configure terminal\n') for port in range(1, 25): # 假设有24个端口 shell.send(f'interface gei-0/1/1/{port}\n') shell.send('mac limit-maximum 1\n') shell.send('safe-mode all enable\n') shell.send('exit\n') shell.send('write\n') shell.send('exit\n') ssh.close()这个Python脚本使用paramiko库SSH登录设备,自动为1-24号端口配置端口安全。在实际使用时,还可以加入异常处理和日志记录功能。
3. 高级功能自动化配置
3.1 端口聚合(LACP)自动化
端口聚合是提高带宽和可靠性的重要手段。记得有次给客户配置服务器双上行,需要配置LACP。我开发了这样的自动化脚本:
#!/bin/bash # LACP配置脚本 switch_ip="192.168.1.1" username="admin" password="zxr10" commands=( "configure terminal" "interface smartgroup100" "switchport mode trunk" "switchport trunk vlan 100-200" "lacp mode 802.3ad" "lacp load-balance dst-mac" "exit" "interface gei-0/1/1/1" "smartgroup 100 mode active" "exit" "interface gei-0/1/1/2" "smartgroup 100 mode active" "exit" "write" ) ( for cmd in "${commands[@]}"; do echo "$cmd" sleep 0.5 done ) | sshpass -p "$password" ssh "$username"@"$switch_ip"这个脚本配置了一个包含两个成员端口的LACP聚合组,使用802.3ad标准协议,基于目的MAC进行负载均衡。通过数组存储命令序列,代码更清晰易读。
3.2 ACL策略批量部署
ACL配置是网络安全的基石。我总结出一个ACL自动化部署的最佳实践:
- 先在文本文件中定义ACL规则
- 使用脚本解析并生成配置命令
- 批量推送到设备
比如创建一个名为"acl_rules.txt"的文件:
# 规则编号 动作 协议 源IP 源掩码 目的IP 目的掩码 端口 10 deny tcp 192.168.1.100 0.0.0.0 any any eq 3389 20 permit ip any any然后使用Python脚本处理:
with open('acl_rules.txt') as f: for line in f: if line.startswith('#'): continue parts = line.strip().split() rule_num = parts[0] action = parts[1] protocol = parts[2] # 其他参数解析... print(f"rule {rule_num} {action} {protocol}...")这种方法特别适合需要部署大量ACL规则的场景,修改规则只需编辑文本文件,不用改脚本代码。
4. 脚本调试与优化技巧
4.1 常见错误排查方法
刚开始写自动化脚本时,我踩过不少坑。这里分享几个调试技巧:
- 启用日志记录:在脚本开头加入日志记录功能,记录每个步骤的执行情况
- 分步验证:先手动执行脚本中的关键命令,确认语法正确
- 超时设置:网络设备响应可能需要时间,在发送命令后适当sleep
- 错误捕获:使用try-catch块捕获异常,避免脚本意外终止
一个带错误处理的Python示例:
try: ssh.connect(ip, username=user, password=pwd, timeout=10) stdin, stdout, stderr = ssh.exec_command('show version') print(stdout.read().decode()) except paramiko.AuthenticationException: print("认证失败,请检查用户名密码") except paramiko.SSHException as e: print(f"SSH连接错误: {str(e)}") finally: ssh.close()4.2 脚本性能优化
当需要管理大量设备时,脚本性能就很重要了。我总结了几点优化经验:
- 并行执行:使用多线程或多进程同时配置多台设备
- 连接复用:避免频繁建立SSH连接,一次连接执行多个命令
- 批量操作:尽量减少交互次数,把多个命令合并执行
- 缓存利用:对不变的数据进行缓存,避免重复查询
Python多线程示例:
from threading import Thread def config_device(ip): # 配置单台设备的代码 pass threads = [] for ip in device_ips: t = Thread(target=config_device, args=(ip,)) threads.append(t) t.start() for t in threads: t.join()5. 实战案例:数据中心交换机自动化部署
去年我参与了一个数据中心项目,需要部署40台中兴ZXR10 5950交换机。通过自动化脚本,我们团队仅用2天就完成了所有设备的初始化配置。以下是核心脚本片段:
#!/bin/bash # 数据中心交换机自动化部署脚本 # 1. 基础配置 base_config() { echo "configure terminal" echo "hostname DC-${1}" echo "banner incoming 警告:未经授权禁止访问!" echo "clock timezone CST 8" echo "enable secret ${2}" echo "lldp enable" echo "exit" } # 2. VLAN配置 vlan_config() { echo "switchvlan-configuration" echo "vlan 1000" echo " name Server_Network" echo "exit" echo "vlan 2000" echo " name Storage_Network" echo "exit" } # 3. 端口配置 port_config() { echo "interface range xgei-0/1/1/1-24" echo " switchport mode trunk" echo " switchport trunk vlan 1000,2000" echo "exit" } # 组合所有配置 generate_config() { base_config $1 $2 vlan_config port_config echo "write" echo "exit" } # 主程序 for switch in $(cat switch_list.txt); do ip=$(echo $switch | cut -d',' -f1) hostnum=$(echo $switch | cut -d',' -f2) password=$(echo $switch | cut -d',' -f3) generate_config $hostnum $password | sshpass -p $password ssh admin@$ip done这个脚本从switch_list.txt读取设备信息,为每台交换机生成完整配置并自动部署。实际项目中我们还加入了错误检查、日志记录和邮件通知功能,确保部署过程万无一失。
6. 安全加固自动化方案
6.1 基础安全配置自动化
网络设备的安全加固是运维工作的重中之重。我总结了一套中兴交换机的安全自动化配置方案:
def secure_device(ip, username, password): commands = [ "configure terminal", "no ip http server", # 禁用HTTP服务 "no ip https server", # 禁用HTTPS服务 "ssh server enable", # 启用SSH "ssh server access-list ipv4 SSH_ACL", "ipv4-access-list SSH_ACL", " rule 10 permit tcp any any eq 22", "exit", "line vty 0 4", " transport input ssh", # 只允许SSH登录 " access-class SSH_ACL in", " login local", "exit", "aaa new-model", "username admin secret strongpassword", # 修改默认密码 "service password-encryption", "ntp server 192.168.1.1", # 配置NTP时间同步 "logging host 192.168.1.100", # 配置日志服务器 "exit", "write" ] # 执行配置命令 ssh_execute(ip, username, password, commands)这个脚本自动完成了一系列安全加固操作,包括禁用不安全服务、配置访问控制、设置强密码等。在实际使用时,建议将密码等敏感信息存储在安全的配置管理系统中。
6.2 定期安全审计自动化
除了初始配置,定期安全审计也很重要。我开发了一个自动审计脚本,检查设备的安全配置状态:
#!/bin/bash # 安全审计脚本 check_items=( "show running-config | include http server" "show running-config | include telnet" "show ssh" "show ntp associations" "show logging" "show ipv4-access-list" ) for ip in $(cat device_list.txt); do echo "===== 安全审计报告:$ip =====" > audit_$ip.log date >> audit_$ip.log for item in "${check_items[@]}"; do echo -e "\n[检查项] $item" >> audit_$ip.log ssh admin@$ip "$item" >> audit_$ip.log done done这个脚本会连接到每台设备,检查关键安全配置并生成审计报告。我们可以设置定时任务,每周自动运行一次,及时发现安全问题。
7. 自动化运维体系构建
7.1 配置版本管理
在大规模网络环境中,配置版本管理至关重要。我设计了一个基于Git的配置管理方案:
import git from datetime import datetime def backup_config(ip, username, password): repo = git.Repo.init('/backup/config_repo') # 获取当前配置 config = ssh_execute(ip, username, password, "show running-config") # 保存到文件 filename = f"{ip}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.cfg" with open(f"/backup/configs/{filename}", "w") as f: f.write(config) # 提交到Git repo.git.add(f"/backup/configs/{filename}") repo.git.commit(m=f"Backup config for {ip} at {datetime.now()}")这个脚本不仅备份配置,还使用Git进行版本管理,可以轻松追踪配置变更历史。结合Jenkins等CI/CD工具,可以构建完整的配置管理流水线。
7.2 自动化监控集成
最后,我们需要将交换机纳入监控系统。这是一个自动添加设备到Zabbix监控的脚本示例:
import requests from requests.auth import HTTPBasicAuth def add_to_zabbix(ip, hostname): url = "http://zabbix_server/api_jsonrpc.php" headers = {"Content-Type": "application/json"} auth = HTTPBasicAuth("api_user", "api_pass") # 获取认证token payload = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "zabbix" }, "id": 1 } response = requests.post(url, json=payload, headers=headers).json() token = response["result"] # 创建主机 payload = { "jsonrpc": "2.0", "method": "host.create", "params": { "host": hostname, "interfaces": [ { "type": 1, "main": 1, "useip": 1, "ip": ip, "dns": "", "port": "161", "details": { "version": "2", "bulk": "1", "community": "{$SNMP_COMMUNITY}" } } ], "groups": [{"groupid": "2"}], # 网络设备组 "templates": [{"templateid": "10001"}] # 网络设备模板 }, "auth": token, "id": 1 } response = requests.post(url, json=payload, headers=headers) print(response.json())这个脚本通过Zabbix API自动添加新交换机到监控系统,配置SNMP监控接口和模板。结合之前的自动化配置脚本,可以实现从设备上线到监控的全流程自动化。