全公司交换机配置定时备份方案
在公司里备份交换机配置是一个非常重要的事情,因为你说不定哪天交换机就宕机了再也起不来了。
实现思路:利用H3C交换机的backup配置命令备份配置文件到tftp服务器,使用脚本定时批量执行。
脚本文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import paramiko
import time
import socket
from datetime import datetime
# 配置信息 - 请根据实际情况修改以下参数
SWITCH_LIST_FILE = "switch_list.txt" # 存放交换机IP的文本文件路径
TFTP_SERVER_IP = "" # TFTP服务器IP
SSH_USERNAME = "" # 交换机SSH用户名
SSH_PASSWORD = # 交换机SSH密码
SSH_PORT = 22 # SSH端口,通常为22
COMMAND_DELAY = 1 # 命令执行间隔时间(秒)
TIMEOUT = 30 # 连接超时时间(秒)
PING_TIMEOUT = 2 # 网络连通性检测超时时间(秒)
def get_switch_ips(filename):
"""从文件中读取交换机IP列表"""
try:
with open(filename, 'r') as f:
# 读取所有非空行,去除空格和换行符
ips = [line.strip() for line in f if line.strip()]
return ips
except FileNotFoundError:
print(f"错误:交换机列表文件 {filename} 不存在")
return []
def is_switch_online(ip, port=SSH_PORT):
"""检测交换机是否在线(通过端口连通性检测)"""
try:
# 尝试连接指定端口,检测网络连通性
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(PING_TIMEOUT)
result = s.connect_ex((ip, port))
return result == 0 # 0表示连接成功
except Exception as e:
print(f"检测 {ip} 在线状态时出错: {str(e)}")
return False
def backup_switch_config(ip):
"""备份单个交换机配置"""
print(f"\n##################### 开始处理交换机 {ip} #########################")
# 先检测交换机是否在线
if not is_switch_online(ip):
print(f"交换机 {ip} 不在线,跳过备份")
return False
# 初始化SSH客户端
ssh = paramiko.SSHClient()
# 自动接受未知的主机密钥
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
# 连接交换机
ssh.connect(
hostname=ip,
port=SSH_PORT,
username=SSH_USERNAME,
password=SSH_PASSWORD,
timeout=TIMEOUT,
look_for_keys=False,
allow_agent=False
)
# 启动交互式会话
channel = ssh.invoke_shell()
time.sleep(COMMAND_DELAY)
# 发送备份配置到TFTP服务器的命令(仅指定IP,不指定文件名)
backup_date = datetime.now().strftime("%Y%m%d")
filename = f"{ip}_{backup_date}_startup.cfg"
backup_command = f"backup startup-configuration to {TFTP_SERVER_IP} {filename}\n"
print(f"执行命令: {backup_command.strip()}")
channel.send(backup_command)
time.sleep(COMMAND_DELAY * 5) # 备份命令可能需要更长时间
# 读取命令输出
output = channel.recv(65535).decode('utf-8', errors='ignore')
# print(f"命令输出:\n{output}")
# 检查是否备份成功
if "Done" in output or "finished" in output:
print(f"交换机 {ip} 配置备份成功√")
return True
else:
return False
except Exception as e:
error_msg = f"连接或操作交换机 {ip} 时出错: {str(e)}"
print(error_msg)
return False
finally:
# 确保连接关闭
if ssh.get_transport() is not None and ssh.get_transport().is_active():
ssh.close()
def main():
"""主函数"""
# 获取交换机IP列表
switch_ips = get_switch_ips(SWITCH_LIST_FILE)
if not switch_ips:
print("没有可用的交换机IP,程序退出")
return
print(f"共发现 {len(switch_ips)} 台交换机,开始批量处理...")
# 记录总体结果
success_count = 0
fail_count = 0
offline_count = 0
# 逐个处理交换机
for ip in switch_ips:
result = backup_switch_config(ip)
if result:
success_count += 1
else:
# 检查是否是因为不在线导致的失败
if not is_switch_online(ip):
offline_count += 1
fail_count += 1
# 处理间隔,避免网络压力过大
time.sleep(2)
# 输出总结报告到控制台和汇总日志
summary = f"\n\n处理完成!总计 {len(switch_ips)} 台交换机\n成功备份: {success_count} 台\n备份失败: {fail_count - offline_count} 台\n设备不在线: {offline_count} 台"
print(summary)
if __name__ == "__main__":
main()
本文由作者按照
CC BY 4.0
进行授权