在数据中心存储网络环境中,华为光纤存储交换机(通常指OceanStor系列或类似产品)的Zone配置管理一直是运维工作的重点和难点。每次变更Zone配置时,管理员需要手动记录当前配置状态,这不仅效率低下,而且在复杂的多交换机环境中容易出错。我在实际运维工作中就遇到过因手工记录遗漏导致的配置回退失败案例。
这个脚本的诞生源于一次深夜紧急故障处理。当时我们需要临时调整某业务系统的Zone划分以隔离故障,但在操作完成后发现无法准确还原初始配置。自那以后,我便着手开发这个自动化配置导出工具,核心目标是实现:
选择Python作为开发语言主要基于三点考量:
脚本通过SSH协议与交换机交互,使用paramiko库实现自动化登录和命令执行。这里特别要注意华为存储交换机的SSH连接特性:
python复制import paramiko
def create_ssh_client(host, port, username, password):
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(host, port=port, username=username, password=password)
return client
脚本包含四个关键模块:
关键命令序列示例:
bash复制# 查看Zone配置
show zone
# 查看Zone别名
show zone -alias
# 查看Zone集配置
show zoneset
华为存储交换机的Zone配置通常包含三部分信息:
通过以下正则表达式提取关键信息:
python复制import re
zone_pattern = re.compile(r'zone:\s+(?P<zone_name>\w+)\s+.*?members:\s+(?P<members>[\w,]+)')
alias_pattern = re.compile(r'alias:\s+(?P<alias_name>\w+)\s+.*?member:\s+(?P<member>\w+)')
为避免不同设备型号的输出差异,脚本会对原始配置进行标准化处理:
输出文件示例:
text复制# Generated at 2023-08-20 14:30:00
# Switch: Huawei_Storage_Switch_01
zone: ZONE_DB_SERVER1
members: 10:00:00:90:FA:01:23:45, 10:00:00:90:FA:01:23:46
alias: ALIAS_DB_SERVER1_WWN
member: 10:00:00:90:FA:01:23:45
每次执行脚本都会在输出目录生成带时间戳的文件:
python复制from datetime import datetime
def generate_filename(switch_name):
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
return f"zone_config_{switch_name}_{timestamp}.txt"
同时维护一个latest链接指向最新配置,便于快速访问:
bash复制ln -sf zone_config_Switch01_20230820_143000.txt latest_zone_config.txt
bash复制chmod +x huawei_zone_export.py
bash复制0 3 * * * /usr/bin/python3 /opt/scripts/huawei_zone_export.py
脚本支持多种运行参数:
text复制Usage: huawei_zone_export.py [options]
Options:
-h, --help show help message
-s SWITCH_IP specify switch IP
-o OUTPUT_DIR set output directory
-v verbose mode
--compare FILE1 FILE2 compare two config files
比较功能实现原理:
python复制def compare_configs(file1, file2):
with open(file1) as f1, open(file2) as f2:
diff = difflib.unified_diff(
f1.readlines(),
f2.readlines(),
fromfile=file1,
tofile=file2
)
return ''.join(diff)
症状:SSH连接超时或认证失败
display ssh server status日志分析:
text复制[2023-08-20 14:25:12] ERROR - SSH connection failed (code: 51)
[2023-08-20 14:25:12] INFO - Retrying (1/3)...
典型场景:
解决方案:
当脚本由不同用户执行时可能遇到:
text复制Permission denied: '/var/backups/zones/latest_zone_config.txt'
推荐解决方案:
bash复制sudo mkdir -p /var/backups/zones
sudo chown -R backup_user:backup_group /var/backups/zones
sudo chmod -R 775 /var/backups/zones
通过线程池实现批量操作:
python复制from concurrent.futures import ThreadPoolExecutor
switches = ['192.168.1.10', '192.168.1.11']
with ThreadPoolExecutor(max_workers=5) as executor:
executor.map(export_zone_config, switches)
集成邮件通知功能:
python复制import smtplib
from email.mime.text import MIMEText
def send_alert(subject, content):
msg = MIMEText(content)
msg['Subject'] = subject
smtp = smtplib.SMTP('smtp.example.com')
smtp.sendmail('alert@example.com', 'admin@example.com', msg.as_string())
将配置信息写入数据库示例:
python复制import sqlite3
def save_to_db(config_data):
conn = sqlite3.connect('network_config.db')
cursor = conn.cursor()
cursor.execute('''
INSERT INTO zone_configs
(switch_ip, config_text, timestamp)
VALUES (?, ?, ?)
''', (config_data['ip'], config_data['text'], config_data['time']))
conn.commit()
当前1.0版本已实现基础功能,后续计划:
实际开发中发现华为交换机的Zone配置有几个特殊点需要注意:
cfgcheck验证配置这个脚本在我们生产环境运行半年以来,已成功捕获3次配置异常变更,在多次维护工作中显著提高了操作效率。特别是在最近一次的机房迁移项目中,通过比对脚本生成的配置快照,快速定位了2处配置遗漏。