工具简介#
PVE AutoSnap(cv4pve-autosnap)用来给 Proxmox VE 的虚拟机做自动快照:定时创建、按策略保留和清理,支持批量管理。项目地址:cv4pve-autosnap。
安装#
# 下载最新版本
wget https://github.com/Corsinvest/cv4pve-autosnap/releases/download/v1.14.8/cv4pve-autosnap-linux-x64.zip
# 解压文件
unzip cv4pve-autosnap-linux-x64.zip
# 移动到系统路径
mv cv4pve-autosnap /usr/bin/
# 设置执行权限
chmod a+x /usr/bin/cv4pve-autosnap
注意:请根据需要选择合适的版本,最新版本信息可查看 GitHub Releases
基本用法#
首先设置 PVE 连接参数:
SNAP_LIST="111,101" # 需要备份的虚拟机 ID 列表
PVE_USER='root@pam' # PVE 用户名
PVE_PASSWD='your_password' # PVE 密码
PVE_HOST='192.168.8.19' # PVE 主机地址
创建虚拟机快照#
批量为指定虚拟机创建快照:
for vmid in ${SNAP_LIST//,/ }; do
cv4pve-autosnap --host=${PVE_HOST} \
--username=${PVE_USER} \
--password=${PVE_PASSWD} \
--vmid=${vmid} \
snap --label=daily --keep=3
done
参数说明:
--host:PVE 主机地址--username:PVE 用户名--password:PVE 密码--vmid:虚拟机 ID--label:快照标签(如 daily、weekly)--keep:保留快照数量
查看快照状态#
查看指定虚拟机的快照信息:
cv4pve-autosnap --host=${PVE_HOST} \
--username=${PVE_USER} \
--password=${PVE_PASSWD} \
--vmid=111 status
封装成脚本#
创建 Script.pve-snap 脚本文件:
#!/bin/bash
#================================================================
# 文件名: Script.pve-snap
# 版本: v1.0
# 日期: 2023/9/25
# 作者: yangzun
# 邮箱: yangzun@treesir.pub
# 描述: PVE 虚拟机快照自动化脚本
#================================================================
# 默认配置参数
SNAP_LIST=${SNAP_LIST:-'101'}
PVE_USER=${PVE_USER:-'root@pam'}
PVE_PASSWD=${PVE_PASSWD:-'your_password'}
PVE_HOST=${PVE_HOST:-'192.168.8.19'}
# 安装 AutoSnap 工具
function install_autosnap() {
echo "正在安装 cv4pve-autosnap 工具..."
wget https://github.com/Corsinvest/cv4pve-autosnap/releases/download/v1.14.8/cv4pve-autosnap-linux-x64.zip
unzip cv4pve-autosnap-linux-x64.zip
mv cv4pve-autosnap /usr/bin/
chmod a+x /usr/bin/cv4pve-autosnap
echo "cv4pve-autosnap 工具安装完成"
}
# 执行快照操作
function execute_snapshot() {
echo "开始执行虚拟机快照操作..."
for vmid in ${SNAP_LIST//,/ }; do
echo "正在为虚拟机 ${vmid} 创建快照..."
cv4pve-autosnap --host=${PVE_HOST} \
--username=${PVE_USER} \
--password=${PVE_PASSWD} \
--vmid=${vmid} \
snap --label=daily --keep=3
done
echo "快照操作执行完成"
}
# 查看快照状态
function check_snapshot_status() {
echo "正在检查虚拟机快照状态..."
for vmid in ${SNAP_LIST//,/ }; do
echo "虚拟机 ${vmid} 的快照状态:"
cv4pve-autosnap --host=${PVE_HOST} \
--username=${PVE_USER} \
--password=${PVE_PASSWD} \
--vmid=${vmid} \
status
done
}
# 主程序逻辑
case "${1}" in
'exec')
install_autosnap
execute_snapshot
;;
'plan')
install_autosnap
check_snapshot_status
;;
*)
echo "用法: $0 {exec|plan}"
echo " exec - 执行快照创建"
echo " plan - 查看快照状态"
exit 1
;;
esac
GitLab CI/CD 配置文件#
创建 .gitlab-ci.yml 配置文件:
# 全局变量配置
variables:
extends: .default_vars
# 计划阶段 - 查看快照状态
.plan:
stage: plan
extends:
- .schedule_trigger_disable
# 执行阶段 - 创建快照
.exec:
stage: exec
extends:
- .master_schedule_manual_trigger
# 公共扩展配置
.extends_group:
extends:
- .runner_tag
- .harbor_auth_vars
- .load_function_before_jobs
- .script_exec_vars
- .nexus_auth_vars
# 计划脚本模板
.plan_script: &plan_script
extends:
- .plan
- .extends_group
script:
- set -- $CI_JOB_NAME
- chmod a+x Script.$1
- ./Script.$1 plan
# 执行脚本模板
.exec_script: &exec_script
extends:
- .exec
- .extends_group
script:
- set -- $CI_JOB_NAME
- chmod a+x Script.$1
- ./Script.$1 exec
# 任务定义
pve-snap plan: *plan_script # 预览快照状态
pve-snap exec: *exec_script # 执行快照创建
运行效果展示#
计划阶段执行结果#

执行阶段运行结果#

几点提醒#
示例里的明文密码只是演示,实际用环境变量或 CI 的 secret 传进去。保留数量 --keep 按存储空间定,留 3-5 份滚动比较常见,快照虽然是增量的,但多了也会占空间。
快照创建失败一般就几个原因:连不上 PVE(查网络、8006 端口、认证信息对不对)、用户权限不够、存储满了、虚拟机状态不对。
