1. 项目概述:为什么交换机配置文件备份是运维的“生命线”
干了十几年网络运维,我见过太多因为配置文件丢失或误改导致的“午夜惊魂”。一次断电重启、一次误操作、甚至一次固件升级失败,都可能让一台核心交换机“失忆”,导致整个业务网络瘫痪。对于H3C交换机这类在企业网中广泛部署的设备,其配置文件(通常以.cfg或.txt结尾)就是它的“大脑”和“记忆”。手动备份?太不靠谱了,人总会忘。所以,实现配置文件的自动备份,不是一项可有可无的“优化”,而是保障网络稳定运行的“生命线”工程。
这个项目要做的,就是搭建一套自动化机制,让网络中的H3C交换机能够定期、可靠地将运行配置或启动配置文件,自动推送到一个指定的、安全的备份服务器上。核心目标就三个:无人值守、定时触发、集中管理。听起来简单,但里面涉及交换机命令行交互、文件传输协议选型、备份服务器搭建、任务调度以及异常处理等一系列细节,任何一个环节没考虑周全,备份就可能变成“摆设”。接下来,我就结合自己踩过的坑和总结的经验,把这套方案的里里外外给你拆解明白。
2. 整体方案设计与核心思路拆解
2.1 为什么选择SCP作为传输协议?
说到自动备份,第一个要决定的就是“怎么传文件”。常见的选项有FTP、TFTP、SFTP和SCP。我们一个个来看为什么最终SCP是更优解。
FTP/TFTP:这是最老牌的文件传输协议。FTP需要单独开启服务,且用户名密码和命令、数据都是明文传输,安全性是硬伤。TFTP更简单,基于UDP,连认证都没有,在局域网内临时传个文件还行,用于生产环境的自动备份,风险太高。一旦备份服务器IP暴露,任何人都能上传下载文件,想想就头皮发麻。
SFTP:这是基于SSH的安全文件传输协议,加密传输,安全性好。功能也强大,支持交互式文件管理。但问题在于,部分老版本的H3C交换机操作系统(如Comware V5)对SFTP的客户端功能支持并不完善,或者配置起来相对复杂。而作为备份的“客户端”(交换机),我们需要的是稳定、普适性高的推送能力。
SCP:同样基于SSH协议,本质上是在SSH连接上执行远程复制命令。它继承了SSH的全部安全性,传输过程加密。最关键的是,SCP命令在绝大多数网络设备(包括各版本H3C Comware系统)上都得到了稳定支持,语法简单直接。它的工作模式非常适合我们的场景:由交换机(客户端)主动发起,将本地文件推送到备份服务器。因此,SCP在安全性、兼容性和易用性上取得了最佳平衡,成为我们方案的首选。
注意:有些新版本设备也支持通过HTTPS或API(如RESTCONF)进行配置备份,这属于更“现代化”的方案,但需要对设备版本和License有要求。SCP方案是当前覆盖最广、最经典的实现方式。
2.2 方案核心组件与工作流程
整个自动备份系统可以看作一个由三部分组成的闭环:
- 备份服务器:接收并存储配置文件的“仓库”。需要开启SSH服务,并创建用于认证的密钥对或准备账号密码。
- H3C交换机:配置文件的“生产者”。需要在其上配置定时任务(Scheduler Job/Timer)和自动执行脚本,在指定时间触发备份和传输动作。
- 传输通道与认证:连接生产者与仓库的“安全走廊”。即基于SSH的SCP协议,核心是解决自动化登录的认证问题(推荐使用SSH密钥,避免密码硬编码)。
其工作流程如下图所示(逻辑描述):
- 定时触发:交换机内置的定时器到达预设时间(如每天凌晨2点)。
- 执行备份脚本:触发一个预定义的Job,该Job执行一系列命令:保存当前配置、通过SCP命令将配置文件传出。
- 安全传输:交换机使用预先配置的SSH密钥(或密码)连接到备份服务器,完成文件传输。
- 归档存储:备份服务器按设备IP、日期等维度对文件进行归档,便于后续查找和版本对比。
2.3 关键决策点:备份什么?何时备份?
在配置之前,必须明确两个基本问题。
备份什么文件?H3C交换机的配置通常涉及两个文件:
startup.cfg:启动配置文件。设备开机时加载的配置。使用display startup查看。vrpcfg.zip(Comware V7) 或config.cfg等:当前运行配置保存后的文件。使用save命令后生成,默认会覆盖启动配置。
对于自动备份,我强烈建议备份“运行配置”保存后生成的文件。因为启动配置可能不是最新的,而运行配置反映了设备当前的状态。我们的脚本应该先执行save(或save force)命令,将当前配置保存到存储介质,然后再传输这个新保存的文件。这样能确保备份的是“此刻”生效的配置。
备份频率如何定?这取决于网络变更的频繁程度。
- 核心/汇聚设备:建议每天备份一次,选择业务低峰期(如凌晨)。
- 接入层设备:配置相对稳定,可以每周备份一次。
- 重大变更前后:除了定期备份,任何人工的重大配置变更前后,应立即手动触发一次备份。自动备份不能完全替代这种“关键时刻”的手动快照。
3. 实操部署:一步步搭建自动备份系统
3.1 备份服务器端准备(以Linux为例)
备份服务器我们选用一台Linux主机(如CentOS或Ubuntu),它需要提供SSH服务并准备好接收文件。
第一步:创建专用备份账号与目录为了安全和管理方便,不要使用root账号。创建一个名为backupuser的专用用户,并为其设置一个强密码(如果后续用密钥认证,密码可设置为随机复杂字符串并禁用密码登录)。
# 创建用户和组 sudo useradd -m -s /bin/bash backupuser # 设置密码 sudo passwd backupuser # 创建备份存储根目录,并更改属主 sudo mkdir -p /network_backup/h3c_configs sudo chown -R backupuser:backupuser /network_backup第二步:配置SSH密钥认证(核心安全步骤)这是实现免密自动SCP的关键。我们需要在交换机上生成密钥对,并将公钥部署到备份服务器上。但请注意,许多H3C交换机生成和存储密钥对的操作可能受限。更通用的做法是在备份服务器上为backupuser生成密钥对,然后将私钥“安全地”配置到交换机上。这里先准备服务器端:
# 切换到备份用户 sudo su - backupuser # 生成SSH密钥对,类型为rsa,密钥长度2048位即可 ssh-keygen -t rsa -b 2048 # 一路回车,默认不设密码短语(passphrase),因为这是用于自动化任务。 # 完成后会在 ~/.ssh/ 目录下生成 id_rsa(私钥)和 id_rsa.pub(公钥)。第三步:配置SSH服务确保服务器的SSH服务(sshd)已安装并运行。编辑SSH服务配置文件/etc/ssh/sshd_config,确保以下参数设置合理:
# 允许公钥认证 PubkeyAuthentication yes # 允许用于认证的公钥文件路径 AuthorizedKeysFile .ssh/authorized_keys # 为了安全,可以禁用root登录和密码登录(在自动化稳定后) # PermitRootLogin no # PasswordAuthentication no将刚才生成的公钥id_rsa.pub内容,写入到backupuser的授权密钥文件中:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh重启SSH服务使配置生效:sudo systemctl restart sshd。
3.2 H3C交换机端配置
现在登录到你的H3C交换机(Comware V7系统示例),开始关键配置。
第一步:将备份服务器的SSH公钥配置到交换机这是最易出错的一步。我们需要将备份服务器上生成的私钥(id_rsa)内容,以特定格式配置到交换机上。因为交换机通常不支持直接读取密钥文件,我们需要将私钥内容转换为一行行的命令。
- 查看备份服务器上的私钥内容:
sudo cat /home/backupuser/.ssh/id_rsa - 你会看到类似如下的内容:
-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAtXa4wYV... ...(很多行Base64编码的字符)... -----END RSA PRIVATE KEY----- - 在H3C交换机上,我们需要进入系统视图,然后使用
public-key peer命令逐段导入。由于命令行长度限制,需要将私钥内容按行拆分后多次输入。
system-view # 创建一个名为BACKUP-SERVER的公共密钥对等体 public-key peer BACKUP-SERVER # 进入公共密钥编码编辑视图。注意,这里需要输入的是私钥内容。 public-key-code begin # 此时,将私钥文件从“-----BEGIN...”到“-----END...”之间的所有行, # 逐行(或每次粘贴合理长度的一段)复制粘贴到命令行。 # 例如,粘贴第一行Base64编码 3082025A02010002818100A1E4B8B7... # 粘贴第二行 D05F7C8F4D1A3B2C8E7A6F5C4E3D2B1A0... # ... 直到所有行输入完毕 # 最后输入结束标识 public-key-code end # 退出对等体视图 peer-public-key end实操心得:这个过程非常繁琐且容易出错。一个更高效的办法是,使用Python或Ansible等自动化工具,在控制机上读取私钥文件,然后通过脚本自动将其拆分成符合CLI输入格式的多条命令,再通过Telnet/SSH会话发送给交换机。手动操作只适用于设备极少的情况。
第二步:配置SSH客户端与用户告诉交换机,当它作为SSH客户端连接备份服务器时,使用哪个密钥对哪个用户进行认证。
# 创建SSH客户端 ssh client BACKUP-CLIENT # 指定连接时使用的公钥对等体(即我们刚才导入的私钥对应的“名称”) public-key BACKUP-SERVER # 指定连接时使用的用户名,必须与备份服务器上的backupuser一致 prefer-username backupuser quit # 创建本地用户,用于关联SSH客户端(某些版本需要) local-user backupuser class manage # 设置服务类型为SSH service-type ssh # 授权角色为network-admin(根据实际权限需要调整) authorization-attribute user-role network-admin # 必须设置为空密码,因为我们将使用密钥认证 password simple第三步:编写自动备份的TCL脚本(核心)H3C Comware V7支持使用TCL(Tool Command Language)脚本实现复杂的自动化逻辑。我们将备份操作写成一个TCL脚本。
# 假设脚本名称为 backup_config.tcl # 首先,保存当前运行配置。force参数避免在无人确认时卡住。 save force # 稍作等待,确保保存完成 after 2000 # 定义变量:备份服务器IP、远程路径、本地文件名 set server_ip “192.168.1.100” set remote_dir “/network_backup/h3c_configs/” set local_file “flash:/startup.cfg” # 假设保存后文件在此路径,请根据设备实际路径调整 # 生成带日期时间戳的远程文件名,便于区分版本 set timestamp [clock format [clock seconds] -format “%Y%m%d_%H%M%S”] set remote_file “${remote_dir}[info hostname]_${timestamp}.cfg” # 执行SCP推送命令。-i 指定之前创建的SSH客户端 # 注意:scp命令在TCL中需要通过 `tclsh` 环境执行,或者直接使用 `exec` 调用命令行。 # 更可靠的方式是使用 `system` 命令模拟命令行输入。 # 这里演示一种方法:通过 spawn 连接到 shell(如果支持) # 但更通用的方法是在Job中直接使用命令行,而非纯TCL。我们将在下一步的Job中展示。实际上,在V7系统中,更常见的做法不是写一个完整的TCL脚本来包含SCP命令,而是用TCL脚本来调度执行CLI命令。我们可以这样设计:
- 创建一个TCL脚本
trigger_backup.tcl,内容主要是触发保存。# trigger_backup.tcl save force after 1000 puts “Configuration saved. SCP job will be scheduled by CLI job.” - 将SCP命令本身放在一个Scheduler Job里,因为SCP命令是CLI命令,可以直接在Job中调用。
第四步:创建调度任务(Scheduler Job & Timer)这是实现“自动”的关键。我们创建一个Job,里面包含具体的备份和传输命令;再创建一个Timer,来定时触发这个Job。
# 创建Job,命名为 AUTO_BACKUP_JOB scheduler job AUTO_BACKUP_JOB # 在Job视图中,按顺序添加需要执行的命令 # 1. 保存配置 command 1 save force # 2. 等待2秒,确保文件写入完成。这里使用ping命令延时的小技巧,或者如果设备支持`job`中的`wait`命令。 command 2 ping 127.0.0.1 -c 3 # 3. 执行SCP推送。这是最关键的一步。 # 格式:scp [local-file] [username]@[server-ip]:[remote-path] -i [ssh-client-name] # 假设设备主机名是SW-Core-01,保存后的配置文件是 flash:/startup.cfg command 3 scp flash:/startup.cfg backupuser@192.168.1.100:/network_backup/h3c_configs/SW-Core-01_`sysdate`.cfg -i BACKUP-CLIENT # `sysdate` 是系统日期变量,但注意其格式可能不适用于文件名。更稳妥的方式是使用TCL生成时间戳,但Job中直接使用较复杂。 # 一个替代方案:远程路径固定,由备份服务器端脚本根据接收时间重命名。或者使用更简单的日期格式。 # 例如,使用 `display clock` 的某个字段,但需要解析。这里我们先使用一个固定名称加日期,假设设备支持简单变量。 # 如果设备不支持,可以考虑第三步改为调用一个包含复杂SCP命令的TCL脚本。 quit # 创建调度时间表,命名为 DAILY_2AM scheduler schedule DAILY_2AM # 设置执行周期为每天 user-role network-admin time repeating at 02:00 # 关联要执行的Job job AUTO_BACKUP_JOB quit重要提示:上面
command 3中的SCP命令是理想情况。在实际中,H3C设备的SCP命令在Job中执行时,可能会因为交互式提示(如确认覆盖文件)而失败。为了解决这个问题,我们需要在备份服务器端做一些调整,或者使用更复杂的脚本。一个实用的变通方法是:在交换机上使用FTP或TFTP将文件先传到本地一个中转服务器(Linux),再由这台中转服务器通过SCP/rsync推到最终的备份服务器。这样可以规避交换机端SCP客户端的复杂性。
3.3 备选简化方案:基于TFTP和Cron的混合模式
鉴于直接在交换机Job中执行SCP可能遇到交互问题,我推荐一个经过大量实践验证的、更稳定的“混合模式”:
交换机端:配置定时Job,只做一件事——将运行配置保存后,通过TFTP协议传输到一台“中转Linux服务器”。TFTP命令简单可靠,无需认证。
scheduler job SIMPLE_BACKUP_JOB command 1 save force command 2 tftp 192.168.1.50 put flash:/startup.cfg backup/SW-Core-01.cfg quit(需要在192.168.1.50上启动TFTP服务,并设置
/var/lib/tftpboot/backup目录可写)中转服务器端(192.168.1.50):编写一个Shell脚本,被Cron定时调用(比如每天2:05分)。这个脚本负责:
- 检查TFTP目录下是否有新文件。
- 使用SCP命令(利用配置好的SSH密钥),将文件推送到最终的备份服务器(192.168.1.100)。
- 在传输成功后,对文件进行重命名(添加时间戳),并清理旧文件。
#!/bin/bash # /usr/local/bin/forward_backup.sh SOURCE_DIR=“/var/lib/tftpboot/backup” BACKUP_SERVER=“backupuser@192.168.1.100” REMOTE_DIR=“/network_backup/h3c_configs/” for cfg_file in ${SOURCE_DIR}/*.cfg; do if [ -f “$cfg_file” ]; then # 生成带时间戳的新文件名 timestamp=$(date +%Y%m%d_%H%M%S) base_name=$(basename “$cfg_file” .cfg) new_name=“${base_name}_${timestamp}.cfg” # 使用SCP传输到最终备份服务器 scp -i /home/forwarduser/.ssh/id_rsa “$cfg_file” ${BACKUP_SERVER}:${REMOTE_DIR}${new_name} # 如果传输成功($? -eq 0),则删除本地文件 if [ $? -eq 0 ]; then rm -f “$cfg_file” logger “Transferred and removed $cfg_file” else logger “Failed to transfer $cfg_file” fi fi done然后添加Cron任务:
crontab -e,添加一行:5 2 * * * /usr/local/bin/forward_backup.sh
这个方案将复杂的认证和可靠传输逻辑,从功能相对简单的交换机转移到了功能强大的Linux服务器上,大大提高了整个系统的稳定性和可维护性。
4. 核心环节深度解析与避坑指南
4.1 SSH密钥认证的“魔鬼细节”
在交换机上配置SSH客户端密钥认证,是第一个大坑。
细节一:密钥格式兼容性。H3C设备通常支持标准的OpenSSH RSA私钥格式(PEM格式)。如果你在Linux上用ssh-keygen -t rsa -m PEM生成的密钥,兼容性最好。避免使用较新的OpenSSH私有格式或ECDSA等算法,除非确认设备支持。
细节二:私钥导入的“行”限制。使用public-key-code begin导入时,每次输入的数据有长度限制。如果私钥内容很长,需要分割成多段输入。一个常见的错误是包含“-----BEGIN RSA PRIVATE KEY-----”和“-----END RSA PRIVATE KEY-----”这两行标记。有些版本要求包含,有些则不要求。最保险的方法是,查看设备手册或使用display public-key peer命令查看已有密钥的格式进行模仿。通常,只需要导入这两行标记之间的Base64编码部分。
细节三:用户与客户端的绑定。创建了SSH客户端(ssh client)并指定了公钥和用户名后,一定要在用于执行SCP命令的VTY用户线视图下,或者在该本地用户(local-user)的配置下,启用SSH服务类型并关联正确的角色。确保执行Job的上下文(通常是定时任务)有足够的权限调用SSH客户端。
4.2 SCP命令在自动化执行中的“陷阱”
即使配置好了密钥,在无人值守的Job中执行scp命令也可能失败。
陷阱一:交互式提示。如果远程文件已存在,SCP命令可能会提示“是否覆盖?(yes/no)”。这在自动化中会导致任务挂起。解决方法有两种:
- (推荐)在备份服务器端处理:让备份服务器上的接收脚本自动处理重命名,或者SCP到一个临时目录,再由服务器端脚本移动。这样交换机始终传输到同一个文件名,无需覆盖确认。
- (交换机端)使用预期交互工具:在更高级的自动化框架(如Expect脚本或Ansible)中,可以处理这种交互。但在纯设备CLI Job中很难实现。
陷阱二:网络波动与超时。SCP传输大文件时可能因网络问题中断。Job中的命令如果失败,默认不会重试。这就需要我们在设计时考虑增加一些容错,或者确保网络链路质量。对于关键设备,可以考虑在Job中连续执行两次save和scp命令,中间加入延时。
陷阱三:路径与文件名。确保交换机上的文件路径(如flash:/startup.cfg)是正确的,并且你有该文件的读取权限。远程路径要确保备份服务器的对应用户(backupuser)有写权限。文件名中尽量避免使用空格和特殊字符,时间戳格式尽量简单(如YYYYMMDD)。
4.3 备份文件的版本管理与归档策略
自动备份跑起来后,很快你就会面临一个问题:每天一个文件,几个月后就会堆积如山。如何管理?
1. 命名规范:文件名应包含设备标识(主机名或IP)、备份日期和时间。例如:SW-Core-01_20231027_020001.cfg。这样一眼就能看出是什么设备、什么时候的配置。
2. 目录结构:在备份服务器上,可以按设备型号、机房、业务单元等建立子目录。例如:
/network_backup/ ├── h3c_configs/ │ ├── Core_Switch/ │ │ ├── SW-Core-01_20231026_020001.cfg │ │ └── SW-Core-01_20231027_020001.cfg │ └── Access_Switch/ │ ├── SW-Acc-101_20231027_020001.cfg │ └── SW-Acc-102_20231027_020001.cfg └── scripts/ └── cleanup_old_backups.sh3. 滚动删除策略:不可能无限期保存所有备份。编写一个简单的清理脚本(如上面的cleanup_old_backups.sh),用Cron定期执行。策略可以是:
- 保留最近7天的每日备份。
- 保留最近4周的每周日备份。
- 保留最近12个月的每月1号备份。 可以使用
find命令配合-mtime参数来实现。
4. 配置差异对比:备份的最终目的是恢复和审计。定期(比如每周)使用diff工具对比最近两次备份的差异,可以帮你发现未经授权的变更。可以将这个对比结果通过邮件发送给管理员。
5. 常见问题排查与实战技巧实录
即使方案设计得再完美,在实际部署中还是会遇到各种问题。下面是我总结的几个典型故障场景和排查思路。
5.1 故障一:SCP连接失败,提示“Permission denied”
这是最常见的问题。
排查步骤:
- 检查网络连通性:在交换机上
ping备份服务器的IP地址,确保路由可达。 - 手动测试SCP:在交换机的用户视图下,手工执行一次SCP命令。不要用Job,就用命令行输入。这会给出最直接的错误信息。
scp flash:/startup.cfg backupuser@192.168.1.100:/tmp/test.cfg -i BACKUP-CLIENT - 分析错误信息:
Connection refused或Connection timed out:备份服务器SSH服务未运行或防火墙拦截(默认端口22)。检查netstat -tlnp | grep :22,以及防火墙规则(firewall-cmd或iptables)。Permission denied (publickey):这是密钥认证失败。- 检查用户名:SCP命令和SSH客户端配置中的用户名,是否与备份服务器上的
backupuser完全一致(大小写敏感)。 - 检查公钥:登录备份服务器,查看
/home/backupuser/.ssh/authorized_keys文件内容,确认公钥已正确添加且格式完整(是一行)。 - 检查私钥:确认在交换机上导入的私钥内容完整无误,没有多余的空格或换行。可以尝试在备份服务器上,用
ssh -i /path/to/private_key backupuser@localhost测试密钥本身是否有效。 - 检查文件权限:备份服务器上
.ssh目录权限应为700,authorized_keys文件权限应为600。权限不对,SSH会出于安全考虑拒绝使用密钥。
- 检查用户名:SCP命令和SSH客户端配置中的用户名,是否与备份服务器上的
Permission denied (password):说明SSH回退到了密码认证,并且密码错误。检查是否在SSH客户端或命令中错误地配置了密码,或者服务器端PasswordAuthentication被设置为no而你又在用密码尝试。
5.2 故障二:Job已触发,但备份文件未生成或为空
排查步骤:
- 检查Job日志:使用
display scheduler logfile命令查看定时任务的执行日志。看AUTO_BACKUP_JOB是否真的被执行,以及执行过程中是否有错误输出。 - 分解Job命令:将Job中的命令拆开,手动逐条执行。特别是
save force命令,看它是否成功保存。有时存储空间不足会导致保存失败。 - 检查文件路径:确认
flash:/startup.cfg这个文件在保存后确实存在,并且有内容。可以用dir flash:/和more flash:/startup.cfg查看。 - 检查TFTP/SCP传输:如果使用了TFTP,在TFTP服务器端查看日志(通常
/var/log/messages或journalctl -u tftp)。确认文件是否被接收到,以及文件大小是否正常。
5.3 故障三:备份成功,但恢复配置时设备异常
排查步骤:
- 核对设备型号和软件版本:配置文件和设备型号、Comware版本是强绑定的。不能将一台S6850的配置恢复到S5820上,即使命令通用,也可能因硬件差异导致问题。恢复前,务必确认备份文件来源与目标设备兼容。
- 分段恢复:不要一次性上传整个配置文件并重启。应该通过FTP/SCP将备份文件下载到设备后,使用
more命令仔细检查内容。然后,在测试环境中或业务低峰期,使用configuration replace file命令(V7支持)进行配置替换,这个命令比直接重启加载更安全,可以回滚。或者,逐段粘贴关键配置。 - 检查配置文件中的敏感信息:有些配置可能包含本地密钥、密码密文(如
local-user的password cipher)等。这些信息在恢复时可能需要根据新环境调整。
5.4 进阶技巧:使用Python脚本实现更强大的备份管理
对于拥有数十上百台H3C设备的环境,逐台配置CLI Job工作量巨大。此时,可以转向基于外部控制器的集中化备份方案。核心思路是:在一台Linux服务器上运行一个Python脚本,用Paramiko或Netmiko库通过SSH依次登录所有交换机,执行display current-configuration命令,将回显的配置直接保存到本地文件。
优势:
- 集中管理:所有备份逻辑在一个脚本中,修改维护方便。
- 无需在每台设备配置Job:只需要设备开启SSH,并提供一个有权限的账号。
- 功能强大:可以轻松实现并发备份、配置差异分析、自动报告生成、加密存储等功能。
- 规避设备端SCP问题:完全不需要在交换机上配置SCP客户端和密钥,只需要最基本的SSH登录权限。
简单示例框架:
import paramiko import time from datetime import datetime devices = [ {‘hostname’: ‘192.168.1.10’, ‘username’: ‘admin’, ‘password’: ‘your_password’, ‘port’: 22}, {‘hostname’: ‘192.168.1.11’, ‘username’: ‘admin’, ‘password’: ‘your_password’, ‘port’: 22}, ] backup_dir = ‘./backups/’ for device in devices: try: client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(**device, look_for_keys=False, timeout=10) # 获取配置 stdin, stdout, stderr = client.exec_command(‘display current-configuration’) config = stdout.read().decode(‘utf-8’) # 生成文件名 filename = f“{backup_dir}{device[‘hostname’]}_{datetime.now().strftime(’%Y%m%d_%H%M%S’)}.cfg” with open(filename, ‘w’) as f: f.write(config) print(f“Backup successful for {device[‘hostname’]}”) client.close() except Exception as e: print(f“Failed to backup {device[‘hostname’]}: {e}”)这个脚本可以放在Cron中定时执行,实现一个轻量级、高可控的集中备份系统。当然,生产环境需要考虑密码的安全存储(如使用Vault)、错误重试、日志记录等更多细节。
最后,我想说的是,自动备份方案没有“银弹”,最适合你网络现状的方案就是最好的。从小规模的CLI Job+SCP开始,随着设备数量增长,再逐步演进到基于Ansible或自研脚本的集中化方案。关键是先让备份跑起来,并定期验证备份文件的可恢复性。毕竟,一份无法恢复的备份,等于没有备份。