В текущей реализации Proxmox Backup Server имя самой виртуальной машины не включается в название бэкапа. Поэтому у меня появилась идея написать скрипт, который будет проверять новые бэкапы и добавлять имя ВМ в поле комментария. Ниже приведён bash-скрипт, который с помощью proxmox-backup-client проверяет и обновляет заметки на всех снимках репозитория. Алгоритм работы:
- Получить список всех снимков
- Перебрать список, проверить, есть ли уже заметка
- Если заметки нет, загрузить qemu-server.conf или pct.conf (в зависимости от того, начинается ли имя с "ct/" или "vm/")
- Распарсить конфиг и получить hostname бэкапной машины
- Добавить комментарий к снимку
Пример вывода скрипта:
Заметка в PBS:
Чтобы использовать этот скрипт, нужны учётные данные PBS с правами на обновление заметок для снимков. Я использовал пользователя root@pam через API-токен.
Сам скрипт:
Bash:
#!/bin/bash
export PBS_REPOSITORY='root@pam!apitoken@localhost:local'
export PBS_PASSWORD='changeme'
export PROXMOX_OUTPUT_NO_BORDER='.'
export PROXMOX_OUTPUT_NO_HEADER='.'
DEBUG=1
function _debug {
[ $DEBUG == "1" ] || return
echo "[$(date +%Y%m%d-%H%M%S)] ($0): $*"
}
function _error {
echo "[$(date +%Y%m%d-%H%M%S)] ($0) ERROR: $*" 1>&2
}
function _exit {
ec=0
if [ "z$1" != "z" ]; then
ec=$1
shift
fi
if [ "z$1" != "z" ]; then
_error $*
fi
exit ${ec}
}
while read snapshot; do
if [ "z${snapshot}" == "z" ]; then continue; fi
note=$(proxmox-backup-client snapshot notes show ${snapshot})
if [ "z${note}" == "z" ]; then
name=""
if [[ $snapshot == "vm/"* ]]; then
name=$(proxmox-backup-client restore ${snapshot} qemu-server.conf - | awk '/^name: / {print $2}')
elif [[ $snapshot == "ct/"* ]]; then
name=$(proxmox-backup-client restore ${snapshot} pct.conf - | awk '/^hostname: / {print $2}')
fi
if [ "z${name}" == "z" ]; then
_exit 1 "Не удалось получить имя для снимка ${snapshot}"
fi
_debug "Обновляю заметку для снимка '${snapshot}': ${name}"
proxmox-backup-client snapshot notes update ${snapshot} ${name}
else
_debug "Заметка уже есть для снимка '${snapshot}'"
fi
done < <(proxmox-backup-client snapshot list | awk '{print $1}')
- Получить список всех снимков
- Перебрать список, проверить, есть ли уже заметка
- Если заметки нет, загрузить qemu-server.conf или pct.conf (в зависимости от того, начинается ли имя с "ct/" или "vm/")
- Распарсить конфиг и получить hostname бэкапной машины
- Добавить комментарий к снимку
Пример вывода скрипта:

Заметка в PBS:

Чтобы использовать этот скрипт, нужны учётные данные PBS с правами на обновление заметок для снимков. Я использовал пользователя root@pam через API-токен.
Сам скрипт:
Bash:
#!/bin/bash
export PBS_REPOSITORY='root@pam!apitoken@localhost:local'
export PBS_PASSWORD='changeme'
export PROXMOX_OUTPUT_NO_BORDER='.'
export PROXMOX_OUTPUT_NO_HEADER='.'
DEBUG=1
function _debug {
[ $DEBUG == "1" ] || return
echo "[$(date +%Y%m%d-%H%M%S)] ($0): $*"
}
function _error {
echo "[$(date +%Y%m%d-%H%M%S)] ($0) ERROR: $*" 1>&2
}
function _exit {
ec=0
if [ "z$1" != "z" ]; then
ec=$1
shift
fi
if [ "z$1" != "z" ]; then
_error $*
fi
exit ${ec}
}
while read snapshot; do
if [ "z${snapshot}" == "z" ]; then continue; fi
note=$(proxmox-backup-client snapshot notes show ${snapshot})
if [ "z${note}" == "z" ]; then
name=""
if [[ $snapshot == "vm/"* ]]; then
name=$(proxmox-backup-client restore ${snapshot} qemu-server.conf - | awk '/^name: / {print $2}')
elif [[ $snapshot == "ct/"* ]]; then
name=$(proxmox-backup-client restore ${snapshot} pct.conf - | awk '/^hostname: / {print $2}')
fi
if [ "z${name}" == "z" ]; then
_exit 1 "Не удалось получить имя для снимка ${snapshot}"
fi
_debug "Обновляю заметку для снимка '${snapshot}': ${name}"
proxmox-backup-client snapshot notes update ${snapshot} ${name}
else
_debug "Заметка уже есть для снимка '${snapshot}'"
fi
done < <(proxmox-backup-client snapshot list | awk '{print $1}')