Приветствую, Habr!
Относительно недавно компания, в которой я работаю, начала предлагать Veeam как основное средство резервного копирования. И все бы ничего, но еще в процессе ознакомления выяснилось следующее:
- инструменты Veeam заточены под Windows, включая развертывание централизованного репозитория;
- под Linux есть только Veeam agent;
Исходя из этого получается, что если организация пользуется только Linux, то никаких вам отчетов не видать. Либо покупаем и ставим Windows, а уже в нем устанавливаем и настраиваем все, что требуется, и получаем оттуда полную информацию о результатах работы Veeam agent (Linux). Либо ходим на каждую машину и смотрим, как там прошел очередной «рабочий день» агента.
И вот настал тот день, когда нашлась маленькая организация, которая использует только Linux и которой очень нужно делать резервные копии и желательно бесплатно. А вот ежедневно следить за тем, как там отработал агент, хочется централизованно, а не массовыми набегами на серверы.
Для решения этого вопроса пришлось идти в FAQ на сайте Veeam и читать, что мы можем получить, используя консоль и доступные команды veeam agent. Из прочитанного родился небольшой Bash скрипт, который смотрит результат выполнения последнего задания, а за одно, свободное место в сетевой папке, предназначенной для хранения резервных копий.
Собственно, скриптом этим я и хочу поделиться. Сразу предупреждаю, я не силен в скриптописании, поэтому критика и предложения приветствуются.
#!/bin/bash
# PARAMETRS
HOST=`hostname`
REPORT_NAME_FORMAT="%d-%m-%Y"
CURRENT_DATE_FORMAT="%d.%m.%Y"
CURRENT_TIME_FORMAT="%H:%M:%S"
REPORT_FILE=report_$(date +$REPORT_NAME_FORMAT).log
#TOKEN="000000000:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
#RECIP_ID="00000000"
REPOSITORY=" "
MOUNT_POINT=" "
# MOUNT_USER=" "
# MOUNT_PASSWORD=" "
# Get Veeam job list
JOB_LIST=($(awk 'NR>1 {print$1}' <<< "$(veeamconfig job list)"))
JOB_RESULT_PATH="/var/log/veeam/Backup/"
echo -e "nStart check on $(date +$CURRENT_DATE_FORMAT) at $(date +$CURRENT_TIME_FORMAT)n" >> $REPORT_FILE
# Check result Veeam backup job
for JOB in $JOB_LIST
do
echo ------------------------------------------------------ >> $REPORT_FILE
echo Check Schedule job name: $JOB from Host: $HOST >> $REPORT_FILE
echo -e "------------------------------------------------------n" >> $REPORT_FILE
echo -e "$(veeamconfig schedule show --jobName $JOB)n" >> $REPORT_FILE
echo ------------------------------------------------------ >> $REPORT_FILE
echo Check latest session Job name: $JOB from Host: $HOST >> $REPORT_FILE
echo -e "------------------------------------------------------n" >> $REPORT_FILE
LAST_JOB_RESULT=$(ls -t $JOB_RESULT_PATH/$JOB | head -n1 | cut -c 25-)
veeamconfig session info --id $LAST_JOB_RESULT >> $REPORT_FILE
done
echo ------------------------------------------------------ >> $REPORT_FILE
echo Stop check on $(date +$CURRENT_DATE_FORMAT) at $(date +$CURRENT_TIME_FORMAT) >> $REPORT_FILE
echo "n" >> $REPORT_FILE
# if the repository owner is not root
# mount -t cifs -o user=$MOUNT_USER,password=$MOUNT_PASSWORD $REPOSITORY $MOUNT_POINT
mount -t cifs $REPOSITORY $MOUNT_POINT
echo ------------------------------------------------------ >> $REPORT_FILE
echo -e "Check files in backup repository:n" >> $REPORT_FILE
ls -h $MOUNT_POINT >> $REPORT_FILE
echo ------------------------------------------------------ >> $REPORT_FILE
echo -e "Check free space on backup repository:n" >> $REPORT_FILE
echo -e "$(df -h $MOUNT_POINT)n" >> $REPORT_FILE
echo -e "------------------------------------------------------nnn" >> $REPORT_FILE
sleep 30
umount $MOUNT_POINT
SEND_RESULT="$(echo -e "$(cat ${REPORT_FILE})")"
# Send result to telegram
# Uncomment the next line to send results to telegram
# curl --silent --data "html&text=$SEND_RESULT" https://api.telegram.org/bot$TOKEN/sendMessage?chat_id=$RECIP_ID&parse_mode=
# Send result to email
# Uncomment the next line to send the results by email and replace <your_mail@yuor_domain>
# mail -s "Report $HOST - $(date +$CURRENT_DATE_FORMAT)" your_mail@yuor_domen < $REPORT_FILE
# if you want delete report file, uncomment next line
# rm -rf $REPORT_FILE #Delete log file
В результате работы скрипта будет подготовлен отчет следующего содержания:
Start check on 10.09.2019 at 14:13:30
------------------------------------------------------
Check Schedule job name: HP from Host: hp
------------------------------------------------------
Every day
At: 23:00
Run automatically: enabled
------------------------------------------------------
Check latest session Job name: HP from Host: hp
------------------------------------------------------
Backup session
ID: {555ebf40-2fb9-47cc-baf0-7192c0ae896e}
Job name: HP
Job ID: {435117d7-ace8-4009-9c51-b00e8174c252}
State: Success
Start time: 2019-09-06 22:43:19
End time: 2019-09-07 00:02:14
------------------------------------------------------
Stop check on 10.09.2019 at 14:13:30
------------------------------------------------------
Check files in backup repository:
media media
------------------------------------------------------
Check free space on backup repository:
Файловая система Размер Использовано Дост Использовано% Cмонтировано в
//share/backup 1,8T 96G 1,7T 6% /media/backup_repository
------------------------------------------------------
В зависимости от выбранного способа, отчет будет отправлен либо на почту, либо в Telegram (мой случай):
Остается добавить задачу в crontab, например, каждый день в 9 утра
0 9 * * * /scripts/check_veeam_backup.sh > /dev/null # Daily check at 9am
Теперь скрипт отрабатывает каждое утро и к моменту начала рабочего дня под рукой есть вся информация о работе агентов и доступном месте на сервере резервного копирования.
В скрипте не все гладко, особенно с именем пользователя и паролем для монтирования сетевой папки, доступ к которой есть только у специального пользователя. Но если разрешить этому пользователю только чтение, то есть явный плюс. Ваши резервные копии никогда не потрутся этим пользователем даже случайно.
Автор: Вячеслав