DigitalOcean DOCTL与Bash循环问题:需控制快照保留数量为12个
完善后的Droplet快照脚本(自动保留最新12个)
我帮你把脚本升级了,不仅能创建带时间戳的快照,还会自动清理旧快照,只保留最新的12个。下面是完整可运行的脚本,我会拆解关键功能:
#!/bin/bash # 脚本使用DigitalOcean的CLI工具doctl创建Droplet快照,并自动保留最新12个 # 配置参数:替换成你的Droplet ID DROPLET_ID="80750079" # 要保留的最新快照数量 RETENTION_COUNT=12 # 生成规范的时间戳作为快照名称(格式:年-月-日_时-分-秒) timestamp() { NAME=$(date +"%Y-%m-%d_%H-%M-%S") } # 1. 创建新快照 timestamp echo "Creating snapshot with name: $NAME" doctl compute droplet-action snapshot --snapshot-name "$NAME" "$DROPLET_ID" # 2. 获取需要删除的旧快照ID(跳过最新的RETENTION_COUNT个) # 说明:先按创建时间降序排列,跳过表头和前RETENTION_COUNT个快照,剩下的就是要删除的 OLD_SNAPSHOTS=$(doctl compute droplet snapshots "$DROPLET_ID" --format ID,CreatedAt --sort CreatedAt:desc | awk -v count="$RETENTION_COUNT" 'NR>count+1 {print $1}') # 3. 批量删除旧快照 if [ -n "$OLD_SNAPSHOTS" ]; then echo "Found $(echo "$OLD_SNAPSHOTS" | wc -w) old snapshots to delete..." for SNAPSHOT_ID in $OLD_SNAPSHOTS; do echo "Deleting snapshot ID: $SNAPSHOT_ID" doctl compute snapshot delete "$SNAPSHOT_ID" --force done echo "Old snapshots cleanup completed." else echo "No old snapshots need to be deleted (current count ≤ $RETENTION_COUNT)." fi
关键功能解释:
- 可配置参数:把Droplet ID和保留数量做成变量,后续修改不用翻找脚本内容,更灵活
- 规范时间戳:用
%Y-%m-%d_%H-%M-%S格式生成快照名称,不仅可读性强,排序也更准确(避免原date命令输出的空格问题) - 精准获取快照:用
doctl compute droplet snapshots $DROPLET_ID直接获取指定Droplet的所有快照,比全局过滤更可靠 - 智能清理逻辑:
- 按创建时间降序排列快照,确保最新的排在最前面
- 用
awk跳过表头和前12个最新快照,剩下的就是需要删除的旧快照 - 批量删除前先检查是否有旧快照,避免空操作报错
使用注意:
- 确保你的
doctl已经完成认证(执行过doctl auth init) - 测试时可以先把
doctl compute snapshot delete改成echo "Would delete snapshot ID: $SNAPSHOT_ID",确认要删除的快照是正确的再执行真实删除
内容的提问来源于stack exchange,提问作者41358
相关产品推荐
相关产品推荐

