Модуль 10. Резервное копирование ALD Pro

Введение

Потеря данных — это страшный сон для владельца любого бизнеса, так как после такого события девять из десяти компаний обычно не выживают. Речь тут идет, конечно же, о потере клиентской базы или интеллектуальной собственности, но даже в менее критичных случаях ущерб может оказаться весьма значителен. Поэтому иногда шутят, что все системные администраторы делятся на три группы: тех, кто не делает бэкапы, кто делает и кто проверяет возможность восстановления системы из резервной копии.

Из этого модуля вы узнаете о том, как выполнять резервное копирование подсистем ALD Pro и в чем заключаются особенности их восстановления, связанные с хранением данных в распределенной базе каталога.

Резервное копирование дисков

Любое серверное приложение представляет собой набор файлов, в которых хранятся пользовательские данные, настройки приложения и программный код. Резервное копирование может быть нацелено на любую из этих категорий файлов или копировать диски целиком, как блочные устройства.

Важно понимать, что при выполнении резервного копирования нужно не только сделать копию данных, но и обеспечить ее согласованность:

  • Если мы полностью выключим сервер и сделаем снимок виртуальной машины (или создадим копии всех его дисков), то у нас не возникнет проблем с запуском системы, см. рис. 383.

  • Если же мы попытаемся копировать файлы или блочное устройство во время работы системы, то данные могут оказаться несогласованными и система не заработает или какие-то изменения окажутся утеряны.

    Современные гипервизоры позволяют создавать горячие снимки виртуальных машин, которые сохраняют не только состояние файлов, но и состояние оперативной памяти на момент создания снимка, что позволяет продолжить работу системы с того же места, но использовать такие копии все же не рекомендуется, т.к. они не всегда могут гарантировать полную консистентность данных.

../_images/image3.png

рис. 383 Создание полного снимка виртуальной машины

Примечание

В случае выключения контроллера домена его клиенты автоматически переключатся на другие серверы, но если так делать постоянно, то лучше выделить так называемую скрытую реплику (англ. hidden replica), которая будет исключена из SRV-записей, чтобы клиенты не выбирали ее в качестве активного контроллера.

Для того чтобы обычный контроллер сделать скрытой репликой, нужно изменить статус командой ipa server-state $(hostname) --state=hidden. Чтобы вернуть контроллер в строй, нужно изменить статус на enabled. Текущее состояние домена покажет команда ipa config-show.

Однако, процедура резервного копирования и восстановления данных усложняется, когда мы имеем дело с кластером серверов, или когда информационная система хранит часть своих данных в таком кластере. Например, если в домене несколько контроллеров, то при восстановлении отдельно взятого сервера у нас нарушится репликация, и чем позднее мы выполним повторную инициализацию такого контроллера, тем больше изменений будет утеряно.

Потребность повторной инициализации вызвана тем, что при восстановлении контроллера домена из резервной копии соседние серверы, с которыми он связан соглашениями о репликации, не смогут отдать ему те изменения, которые были внесены в домен непосредственно с его участием. Очень подробно механизм репликации был рассмотрен в Модуль 8. Управление топологией в домене.

На лабораторном стенде перед созданием снимков виртуальных машин вы без проблем можете выключить все контроллеры домена, чтобы получить консистентное состояние. Но в продуктивной среде такой сценарий невозможен, и отдельные снимки можно использовать в двух случаях:

  • С помощью такой копии можно быстро восстановить операционную систему вместе с настройками приложений. Останется только выполнить инициализацию контроллера, и сервер будет полностью готов к работе.

  • С помощью такой копии вы можете восстановить данные каталога, актуальные на момент создания копии. В этом случае после восстановления контроллера вам нужно будет выполнить инициализацию в противоположном направлении, затирая данные действующих контроллеров информацией из восстановленной копии.

Чтобы переинициализировать контроллер, выполните следующие действия, см. рис. 384:

  • Откройте страницу Управление доменом ‣ Сайты и службы ‣ Соглашения о репликации.

  • Выберите соглашение о репликации, в котором участвует сервер, восстановленный из резервной копии.

  • Нажмите на кнопку Переинициализировать контроллер домена рядом с тем сервером, данные которого вы хотите затереть.

../_images/image51.png

рис. 384 Переинициализация контроллера домена

Из командной строки это можно сделать с помощью утилиты ipa-replica-manage:

admin@dc-2:~$ sudo ipa-replica-manage re-initialize --from dc-1.ald.company.lan

При восстановлении обычных подсистем (не контроллеров) из снимков нужно учитывать, что с версии 2.4.0 все подсистемы хранят свое целевое состояние в каталоге LDAP.

Резервное копирование данных

Учитывая, что полное выключение сервера приводит к временному прерыванию в обслуживании клиентов, в многие системы реализуют функции резервного копирования, которые гарантируют целостность данных при снятии копий «на горячую». Например, вы можете сделать дамп базы PostgreSQL или каталога 389DS. Мы рассмотрим несколько скриптов резервного копирования контроллера домена и отдельных подсистем.

Контроллеры домена

Чтобы выполнить резервное копирование контроллера домена перейдем на нем в режим суперпользоватля. Затем создадим в каталоге /root скрипт backup_dc.sh:

#!/usr/bin/env bash
now="$(date +'%Y-%m-%dT%H-%M-%S')"
app="$(echo $0 | cut -d '/' -f 2 )"
# функция логирования
function log() { logger -t "$app" "$1"; echo "$1"; }
# получим версию aldpro для указания бекапа
aldpro_version="$(cat /etc/apt/sources.list.d/aldpro.list | cut -d '/' -f 7 | cut -d ' ' -f 1)"
log "Начато создание резервной копии ${app} ${aldpro_version} ${HOSTNAME} ${now}"
# папка резервной копии ALD Pro
aldpro_backups="/var/backups/aldpro/"

# Название директории для резервной копии формируется
# из текущей даты, времени в формате ISO и версии ALD Pro и находится в папке $aldpro_backups
BACKUP_PATH="${aldpro_backups}${now}-${aldpro_version}"
log "Создание временной директории для резервных копий $BACKUP_PATH"
mkdir -p $BACKUP_PATH

log "Создание резервной копии FreeIPA $(ipa --version)"
ipa-backup
log "Архивирование РК FreeIPA"
tar -zcvf $BACKUP_PATH/ipa.tar.gz /var/lib/ipa/backup
log "Очистка промежуточного бэкапа FreeIPA"
rm -rf /var/lib/ipa/backup/*

log "Остановка затрагиваемых бэкапом сервисов"
systemctl stop apache2 celery celerybeat rabbitmq-server postgresql aldpro-salt-minion

log "Архивирование БД PostgreSQL"
tar -zcvf $BACKUP_PATH/postgresql.tar.gz /var/lib/postgresql/
log "Архивирование RabbitMQ"
tar -zcvf $BACKUP_PATH/rabbitmq.tar.gz /var/lib/rabbitmq/mnesia/
log "Архивирование директории ipa-client"
tar -zcvf $BACKUP_PATH/ipa-client.tar.gz /var/lib/ipa-client/
log "Архивирование логов"
tar -zcvf $BACKUP_PATH/log.tar.gz --exclude=faillog --exclude=lastlog /var/log/
log "Архивирование директории etc"
tar -zcvf $BACKUP_PATH/etc.tar.gz /etc/
log "Архивирование директории rbta"
tar -zcvf $BACKUP_PATH/rbta.tar.gz /opt/rbta/

log "Запуск затрагиваемых бэкапом сервисов"
systemctl start apache2 celery celerybeat rabbitmq-server postgresql aldpro-salt-minion

log "Копируем директорию резервной копии на другой носитель"
# Вместо /mnt/ вы можете настроить свою директорию (облако или сетевой диск)
cp -r $BACKUP_PATH /mnt/

log "Удаляем резервные копии старше 30 дней для ротации"
find "${aldpro_backups}" -type d -mtime +30 -exec rm -rf {} \;
log "Создание копии завершено!"

Работу скрипта можно отслеживать в системном журнале. Откроем новое окно терминала и выполним команду:

sudo journalctl -f | grep backup_dc

Поставим на скрипт бит исполнения запустим и запустим его:

chmod u+x ./backup_dc.sh
./backup_dc.sh

Просмотрим созданные файлы в директории резервных копий:

ls -lh  "/var/backups/aldpro/$(ls /var/backups/aldpro | sort | tail -1)"

Для восстановления Контроллера домена перейдем в режим суперпользователя и в каталоге /root создадим файл restore_dc.sh. Запишем в него следующие строки:

#!/bin/bash
help="Для запуска восстановления нужно указать папку аргументом\n ./restore_dc.sh DATE-DIR"
aldpro_backups="/var/backups/aldpro/"
app="$(echo $0 | cut -d '/' -f 2 )"
# функция логирования
function log() { logger -t "$app" "$1"; echo "$1"; }
function err() { logger --priority user.error -t "$app" "$1"; echo -e "\033[0;31m$1\033[0m";  }
# проверка наличия аргумента папки РК для восстановления
if [[ -z "$1" ]]; then
   err "Ошибка! Нет аргумента в виде папки!"
   echo -e "\n$help"
   echo -e "\nСписок доступных резервных копий:"
   ls "$aldpro_backups"
   exit 1
fi
RESTORE_PATH="${aldpro_backups}$1"
# Перейти в директорию с резервными копиями
cd $RESTORE_PATH
# Получаем ошибку если нет такой директории резервной копии
check_backup=$?
# Проверим дату бекапа в аргументе, иначе выведем список дат для удобства
if [[ "$check_backup" -gt 0 ]]; then
   err "Ошибка! Нет $RESTORE_PATH резервной копии!"
   echo "Выберите дату резервной копии:"
   ls "$aldpro_backups"
   exit "$check_backup"
fi
log "Начато восстановление $RESTORE_PATH резервной копии!"
set -e # для возможности отмены Ctrl+Z и если ошибка, то выход будет сразу
log "Разархивирование РК IPA ipa.tar.gz"
tar -C "/" -xvf ipa.tar.gz
# вычислим дату резервной копии из архива
ipa_date_time="$(tar tf ipa.tar.gz | grep 'ipa-full' | cut -d '/' -f 5 | grep -v '^$' | sort | tail -1 | uniq)"
log "Восстановление IPA из РК /var/lib/ipa/backup/$ipa_date_time"
ipa-restore "/var/lib/ipa/backup/$ipa_date_time"
log "Остановка затрагиваемых восстановлением сервисов"
systemctl stop apache2 celery celerybeat rabbitmq-server postgresql aldpro-salt-minion
log "Восстановление БД Postgresql"
tar -C "/" -xvf postgresql.tar.gz
log "Восстановление RabbitMQ"
tar -C "/" -xvf rabbitmq.tar.gz
log "Восстановление логов"
tar -C "/" -xvf log.tar.gz
log "Восстановление директории etc"
tar -C "/" -xvf etc.tar.gz
log "Восстановление директории rbta"
tar -C "/" -xvf rbta.tar.gz
log "Восстановление ipa-client"
tar -C "/" -xvf ipa-client.tar.gz

log "Восстановление завершено. Перезагрузка!"
sleep 5 && reboot

Сделаем скрипт исполняемым и запустим его. В качестве аргумента скрипту следует передать дату резервной копии:

chmod u+x ./restore_dc.sh
./restore_dc.sh "ДАТА-ИЗ-СПИСКА"

Если такой даты нет, то будет выведен список всех имеющихся резервных копий. Эта информация содержится в переменной $aldpro_backup.

Во время восстановления утилита ipa потребует ввести пароль от учетной записи Directory Manager. Кроме того, надо будет подтвердить восстановление написав yes:

root@dc-1:~# ./restore_dc.sh 2025-04-03T13-07-30-2.4.0
var/lib/ipa/backup/
var/lib/ipa/backup/ipa-full-2025-04-03T13-07-30-2.4.0/
var/lib/ipa/backup/ipa-full-2025-04-03T13-07-30-2.4.0/header
var/lib/ipa/backup/ipa-full-2025-04-03T13-07-30-2.4.0/ipa-full.tar
/var/lib/ipa/backup/ipa-full-2025-04-03T13-07-30-2.4.0
Directory Manager (existing master) password:

Preparing restore from /var/lib/ipa/backup/ipa-full-2025-04-03T13-07-30-2.4.0 on dc-1.ald.company.lan
Performing FULL restore from FULL backup
Temporary setting umask to 022
Restoring data will overwrite existing live data. Continue to restore? [no]:

Если в домене несколько контроллеров, то после восстановления сервера вы будете наблюдать ошибки репликации в журнале /var/log/dirsrv/slapd-ALD-COMPANY-LAN/errors, и вам нужно будет как можно скорее выполнить повторную инициализацию этого сервера (или, наоборот, использовать данные этого сервера для переинициализации остальных контроллеров в домене). Например, если мы восстановили dc-2 и хотим забрать актуальные данные с dc-1, то нужно выполнить команду:

admin@dc-2:~$ sudo ipa-replica-manage re-initialize --from dc-1.ald.company.lan
Update in progress, 7 seconds elapsed
Update succeeded

Напомним, что для проверки состояния репликации между двумя конкретными серверами RedHat предлагает использовать утилиту ds-replcheck:

ds-replcheck online -D "cn=Directory Manager" -m ldap://dc-1.ald.company.lan:389 -r ldap://dc-2.ald.company.lan:389 -b dc=ald,dc=company,dc=lan

Наконец, состояние репликации можно проверить с помощью утилиты cipa которую мы рассматривали в Модуль 8. Управление топологией в домене:

read -s -p "Enter password: " pswd && cipa -d ald.company.lan -W "$pswd"

Результат выполнения этой команды будет примерно таким:

+--------------------+---------+---------+-------+
| FreeIPA servers:   | dc-1    | dc-2    | STATE |
+--------------------+---------+---------+-------+
| Active Users       | 2       | 2       | OK    |
| Stage Users        | 0       | 0       | OK    |
| Preserved Users    | 1       | 1       | OK    |
| Hosts              | 4       | 4       | OK    |
| Services           | 10      | 10      | OK    |
| User Groups        | 6       | 6       | OK    |
| Host Groups        | 1       | 1       | OK    |
| Netgroups          | 0       | 0       | OK    |
| HBAC Rules         | 2       | 2       | OK    |
| SUDO Rules         | 0       | 0       | OK    |
| DNS Zones          | 2       | 2       | OK    |
| Certificates       | 0       | 0       | OK    |
| LDAP Conflicts     | 0       | 0       | OK    |
| Ghost Replicas     | 0       | 0       | OK    |
| Anonymous BIND     | ROOTDSE | ROOTDSE | OK    |
| Microsoft ADTrust  | True    | True    | OK    |
| Replication Status | dc-2 19 | dc-1 0  | FAIL  |
+--------------------+---------+---------+-------+

Здесь:

  • Replication Status - указывает состояние ошибки (FAIL) или успеха (OK)

  • dc-2 19 - число различий с репликой (19)

  • dc-1 0 - число различий с репликой (0)

Подсистема общего доступа к файлам

Создадим файл backup_files.sh в домашней папке root с таким содержимым:

#!/usr/bin/env bash
now="$(date +'%Y-%m-%dT%H-%M-%S')"
app="$(echo $0 | cut -d '/' -f 2 )"
# функция логирования
function log() { logger -t "$app" "$1"; echo "$1"; }
# папка резервной копии ALD Pro
aldpro_backups="/var/backups/aldpro/"
aldpro_version="$(cat /etc/apt/sources.list.d/aldpro.list | cut -d '/' -f 7 | cut -d ' ' -f 1)"
log "Начато создание РК ${app} ${aldpro_version} ${HOSTNAME} ${now}"

# Название директории для резервной копии формируется
# из текущей даты, версии и находится в папке
BACKUP_PATH="${aldpro_backups}${now}-${aldpro_version}"
log "Создание временной директории для резервных копий $BACKUP_PATH"
mkdir -p $BACKUP_PATH
log "Остановка затрагиваемых бэкапом сервисов"
systemctl stop winbind smbd nmbd aldpro-salt-minion
#log "Архивирование логов"
#tar -zcvf "$BACKUP_PATH/log.tar.gz"--exclude=faillog --exclude=lastlog /var/log/
log "Архивирование директории etc"
tar -zcvf "$BACKUP_PATH/etc.tar.gz" /etc/
log "Архивирование директории ipa-client"
tar -zcvf "$BACKUP_PATH/ipa-client.tar.gz" /var/lib/ipa-client/
log "Архивирование директории /opt/samba_shares/"
tar -zcvf "$BACKUP_PATH/samba.tar.gz" /opt/samba_shares/
log "Запуск затрагиваемых бэкапом сервисов"
systemctl start winbind smbd nmbd aldpro-salt-minion

# Вместо /mnt/ вы можете настроить свою директорию (облако или сетевой диск)
log "Копируем директорию резервной копии на другой носитель"
cp -r $BACKUP_PATH /mnt/

log "Удаляем резервные копии старше 30 дней для ротации"
find "${aldpro_backups}" -type d -mtime +30 -exec rm -rf {} \;
log "Создание копии ${app} завершено!"

Для восстановления создадим файл restore_files.sh в домашней папке root с таким содержимым:

#!/bin/bash
set -e # для возможности отмены Ctrl+Z и если ошибка то выход будет сразу
app="$(echo $0 | cut -d '/' -f 2 )"
help="Для запуска восстановления нужно указать папку аргументом\n ./${app} DATE-DIR"
aldpro_backups="/var/backups/aldpro/"
# функция логирования
function log() { logger -t "$app" "$1"; echo "$1";  }
function err() { logger --priority user.error -t "$app" "$1"; echo -e "\033[0;31m$1\033[0m";  }
# проверка наличия аргумента папки РК для восстановления
if [[ -z "$1" ]]; then
   err "Ошибка! Нет аргумента в виде папки!"
   echo -e "\n$help"
   echo -e "\nСписок доступных резервных копий:"
   ls "$aldpro_backups"
   exit 1
fi
# Переход в директорию с резервными копиями
RESTORE_PATH="${aldpro_backups}$1"
# Перейти в директорию с резервными копиями
cd $RESTORE_PATH
# Получаем ошибку если нет такой директории резервной копии
check_backup=$?
# Проверим дату бекапа в аргументе, иначе выведем список дат для удобства
if [[ "$check_backup" -gt 0 ]]; then
   err "Ошибка! Нет $RESTORE_PATH резервной копии!"
   echo "Выберите дату резервной копии:"
   ls "$aldpro_backups"
   exit "$check_backup"
fi

log "Начато восстановление $RESTORE_PATH резервной копии!"
log "Остановка затрагиваемых восстановлением сервисов"
systemctl stop winbind smbd nmbd aldpro-salt-minion
# log "Восстановление логов"
# tar -С "/" -xvf log.tar.gz
log "Восстановление директории etc"
tar -C "/" -xvf etc.tar.gz
log "Восстановление ipa-client"
tar -C "/" -xvf ipa-client.tar.gz
log "Восстановление общих директорий samba"
tar -C "/" -xvf samba.tar.gz

log "Восстановление завершено. Перезагрузка!"
sleep 5 && reboot

Подсистема печати

Для выполнения резервного копирования создадим файл backup_cups.sh в домашней папке root с таким содержимым :

#!/usr/bin/env bash
now="$(date +'%Y-%m-%dT%H-%M-%S')"
app="$(echo $0 | cut -d '/' -f 2 )"
# функция логирования
function log() { logger -t "$app" "$1"; echo "$1"; }
# папка резервной копии ALD Pro
aldpro_backups="/var/backups/aldpro/"
aldpro_version="$(cat /etc/apt/sources.list.d/aldpro.list | cut -d '/' -f 7 | cut -d ' ' -f 1)"
log "Начато создание РК ${app} ${aldpro_version} ${HOSTNAME} ${now}"

# Название директории для резервной копии формируется
# из текущей даты, версии и находится в папке $aldpro_backups
BACKUP_PATH="${aldpro_backups}${now}-${aldpro_version}"

log "Создание временной директории для резервных копий $BACKUP_PATH"
mkdir -p $BACKUP_PATH

log "Остановка затрагиваемых бэкапом сервисов"
systemctl stop cups aldpro-salt-minion
log "Архивирование директории ipa-client"
tar -zcvf $BACKUP_PATH/ipa-client.tar.gz /var/lib/ipa-client/
# архивирование логов
tar -zcvf $BACKUP_PATH/log.tar.gz --exclude=faillog --exclude=lastlog /var/log/
log "Архивирование директории etc"
tar -zcvf $BACKUP_PATH/etc.tar.gz /etc/
log "Запуск затрагиваемых бэкапом сервисов"
systemctl start cups aldpro-salt-minion

# Вместо /mnt/ вы можете настроить свою директорию (облако или сетевой диск)
log "Копируем директорию резервной копии на другой носитель"
cp -r $BACKUP_PATH /mnt/

log "Удаляем резервные копии старше 30 дней для ротации"
find "${aldpro_backups}" -type d -mtime +30 -exec rm -rf {} \;
log "Создание копии ${app} завершено!"

Для восстановления подсистемы печати создадим файл restore_cups.sh в домашней папке root с таким содержимым:

#!/bin/bash
app="$(echo $0 | cut -d '/' -f 2 )"
help="Для запуска восстановления нужно указать папку аргументом\n ./${app} DATE-DIR"
aldpro_backups="/var/backups/aldpro/"
# функция логирования
function log() { logger -t "$app" "$1"; echo "$1";  }
function err() { logger --priority user.error -t "$app" "$1"; echo -e "\033[0;31m$1\033[0m";  }
# проверка наличия аргумента папки РК для восстановления
if [[ -z "$1" ]]; then
   err "Ошибка! Нет аргумента в виде папки!"
   echo -e "\n$help"
   echo -e "\nСписок доступных резервных копий:"
   ls "$aldpro_backups"
   exit 1
fi
# Переход в директорию с резервными копиями
RESTORE_PATH="${aldpro_backups}$1"
# Перейти в директорию с резервными копиями
cd $RESTORE_PATH
# Получаем ошибку если нет такой директории резервной копии
check_backup=$?
# Проверим дату бекапа в аргументе, иначе выведем список дат для удобства
if [[ "$check_backup" -gt 0 ]]; then
   err "Ошибка! Нет $RESTORE_PATH резервной копии!"
   echo "Выберите дату резервной копии:"
   ls "$aldpro_backups"
   exit "$check_backup"
fi

log "Начато восстановление $RESTORE_PATH резервной копии!"
set -e # для возможности отмены Ctrl+Z и если ошибка, то выход будет сразу
log "Остановка затрагиваемых восстановлением сервисов"
systemctl stop cups aldpro-salt-minion
# log "Восстановление логов"
tar -C "/" -xvf log.tar.gz
log "Восстановление директории etc"
tar -C "/" -xvf etc.tar.gz
log "Восстановление ipa-client"
tar -C "/" -xvf ipa-client.tar.gz

log "Восстановление завершено. Перезагрузка!"
sleep 5 && reboot

Подсистема репозиториев ПО

Для выполнения резервного копирования подсистемы репозиториев ПО создадим файл backup_repo.sh в домашней папке root с таким содержимым:

#!/usr/bin/env bash
now="$(date +'%Y-%m-%dT%H-%M-%S')"
app="$(echo $0 | cut -d '/' -f 2 )"
# функция логирования
function log() { logger -t "$app" "$1"; echo "$1"; }
# папка резервной копии ALD Pro
aldpro_backups="/var/backups/aldpro/"
aldpro_version="$(cat /etc/apt/sources.list.d/aldpro.list | cut -d '/' -f 7 | cut -d ' ' -f 1)"
log "Начато создание РК ${app} ${aldpro_version} ${HOSTNAME} ${now}"

# Название директории для резервной копии формируется
# из текущей даты, версии и находится в папке $aldpro_backups
BACKUP_PATH="${aldpro_backups}${now}-${aldpro_version}"

log "Создание временной директории для резервных копий $BACKUP_PATH"
mkdir -p $BACKUP_PATH

log "Остановка затрагиваемых бэкапом сервисов"
systemctl stop apache2 postgresql rabbitmq-server aldpro-salt-minion
log "Архивирование БД PostgreSQL"
tar -zcvf $BACKUP_PATH/postgresql.tar.gz /var/lib/postgresql/
log "Архивирование данных брокера очередей RabbitMQ"
tar -zcvf $BACKUP_PATH/rabbitmq.tar.gz /var/lib/rabbitmq/mnesia/
log "Архивирование директории ipa-client"
tar -zcvf $BACKUP_PATH/ipa-client.tar.gz /var/lib/ipa-client/
log "Архивирование директории repo/storage"
tar -zcvf $BACKUP_PATH/storage.tar.gz /opt/rbta/aldpro/repo/storage/
# архивирование логов
log "Архивирование логов"
tar -zcvf $BACKUP_PATH/log.tar.gz --exclude=faillog --exclude=lastlog /var/log/

log "Запуск бэкапируемых сервисов"
systemctl start apache2 postgresql rabbitmq-server aldpro-salt-minion

# Вместо /mnt/ вы можете настроить свою директорию (облако или сетевой диск)
log "Копируем директорию резервной копии на другой носитель"
cp -r $BACKUP_PATH /mnt/

log "Удаляем резервные копии старше 30 дней для ротации"
find "${aldpro_backups}" -type d -mtime +30 -exec rm -rf {} \;
log "Создание копии ${app} завершено!"

Для восстановления подсистемы репозитория создадим файл restore_repo.sh в домашней папке root с таким содержимым:

#!/bin/bash
app="$(echo $0 | cut -d '/' -f 2 )"
help="Для запуска восстановления нужно указать папку аргументом\n ./${app} DATE-DIR"
aldpro_backups="/var/backups/aldpro/"
# функция логирования
function log() { logger -t "$app" "$1"; echo "$1";  }
function err() { logger --priority user.error -t "$app" "$1"; echo -e "\033[0;31m$1\033[0m";  }
# проверка наличия аргумента папки РК для восстановления
if [[ -z "$1" ]]; then
   err "Ошибка! Нет аргумента в виде папки!"
   echo -e "\n$help"
   echo -e "\nСписок доступных резервных копий:"
   ls "$aldpro_backups"
   exit 1
fi
RESTORE_PATH="${aldpro_backups}$1"
# Перейти в директорию с резервными копиями
cd "$RESTORE_PATH"
# Получаем ошибку если нет такой директории резервной копии
check_backup=$?
# Проверим дату бекапа в аргументе, иначе выведем список дат для удобства
if [[ "$check_backup" -gt 0 ]]; then
   err "Ошибка! Нет $RESTORE_PATH резервной копии!"
   echo "Выберите дату резервной копии:"
   ls "$aldpro_backups"
   exit "$check_backup"
fi
log "Начато восстановление $RESTORE_PATH резервной копии!"
set -e # для возмоности отмены Ctrl+Z и если ошибка, то выход будет сразу
log "Остановка затрагиваемых восстановлением сервисов"
systemctl stop apache2 postgresql rabbitmq-server aldpro-salt-minion
log "Восстановление БД PostgreSQL"
tar -C "/" -xvf postgresql.tar.gz
log "Восстановление RabbitMQ"
tar -C "/" -xvf rabbitmq.tar.gz
# # Восстановление логов
tar -C "/" -xvf log.tar.gz
log "Восстановление директории etc"
tar -C "/" -xvf etc.tar.gz
log "Восстановление ipa-client"
tar -C "/" -xvf ipa-client.tar.gz
log "Восстановление директории с репозиториями"
tar -C "/" -xvf storage.tar.gz

log "Восстановление завершено. Перезагрузка!"
sleep 5 && reboot

Подсистема DHCP

Для выполнения резервного копирования подсистемы DHCP создадим файл backup_dhcp.sh в домашней папке root с таким содержимым:

#!/usr/bin/env bash
now="$(date +'%Y-%m-%dT%H-%M-%S')"
app="$(echo $0 | cut -d '/' -f 2 )"
# функция логирования
function log() { logger -t "$app" "$1"; echo "$1"; }
# папка резервной копии ALD Pro
aldpro_backups="/var/backups/aldpro/"
aldpro_version="$(cat /etc/apt/sources.list.d/aldpro.list | cut -d '/' -f 7 | cut -d ' ' -f 1)"
log "Начато создание РК ${app} ${aldpro_version} ${HOSTNAME} ${now}"

# Название директории для резервной копии формируется
# из текущей даты, версии и находится в папке $aldpro_backups
BACKUP_PATH="${aldpro_backups}${now}-${aldpro_version}"

log "Создание временной директории для резервных копий $BACKUP_PATH"
mkdir -p $BACKUP_PATH
log "Остановка затрагиваемых бэкапом сервисов"
systemctl stop isc-dhcp-server aldpro-salt-minion
# Архивирование директории ipa-client
tar -zcvf $BACKUP_PATH/ipa-client.tar.gz /var/lib/ipa-client/

# Архивирование директории etc
tar -zcvf $BACKUP_PATH/etc.tar.gz /etc/

log "Запуск затрагиваемых бэкапом сервисов"
systemctl start isc-dhcp-server aldpro-salt-minion

# Вместо /mnt/ вы можете настроить свою директорию (облако или сетевой диск)
log "Копируем директорию резервной копии на другой носитель"
cp -r $BACKUP_PATH /mnt/

log "Удаляем резервные копии старше 30 дней для ротации"
find "${aldpro_backups}" -type d -mtime +30 -exec rm -rf {} \;
log "Создание копии ${app} завершено!"

Для восстановления подсистемы DHCP создадим файл restore_dhcp.sh в домашней папке root с таким содержимым:

#!/bin/bash
app="$(echo $0 | cut -d '/' -f 2 )"
help="Для запуска восстановления нужно указать папку аргументом\n ./${app} DATE-DIR"
aldpro_backups="/var/backups/aldpro/"
# функция логирования
function log() { logger -t "$app" "$1"; echo "$1";  }
function err() { logger --priority user.error -t "$app" "$1"; echo -e "\033[0;31m$1\033[0m";  }
# проверка наличия аргумента папки РК для восстановления
if [[ -z "$1" ]]; then
   err "Ошибка! Нет аргумента в виде папки!"
   echo -e "\n$help"
   echo -e "\nСписок доступных резервных копий:"
   ls "$aldpro_backups"
   exit 1
fi
RESTORE_PATH="${aldpro_backups}$1"
# Перейти в директорию с резервными копиями
cd $RESTORE_PATH
# Получаем ошибку если нет такой директории резервной копии
check_backup=$?
# Проверим дату бекапа в аргументе, иначе выведем список дат для удобства
if [[ "$check_backup" -gt 0 ]]; then
   err "Ошибка! Нет $RESTORE_PATH резервной копии!"
   echo "Выберите дату резервной копии:"
   ls "$aldpro_backups"
   exit "$check_backup"
fi
log "Начато восстановление $RESTORE_PATH резервной копии!"
set -e # для возмоности отмены Ctrl+Z и если ошибка, то выход будет сразу
log "Остановка затрагиваемых восстановлением сервисов"
systemctl stop isc-dhcp-server aldpro-salt-minion
log "Восстановление директории etc"
tar -C "/" -xvf etc.tar.gz
log "Восстановление  ipa-client"
tar -C "/" -xvf ipa-client.tar.gz

log "Восстановление завершено. Перезагрузка!"
sleep 5 && reboot

Подсистема PXE

Для выполнения резервного копирования подсистемы PXE создадим файл backup_pxe.sh в домашней папке root с таким содержимым:

#!/usr/bin/env bash
now="$(date +'%Y-%m-%dT%H-%M-%S')"
app="$(echo $0 | cut -d '/' -f 2 )"
# функция логирования
function log() { logger -t "$app" "$1"; echo "$1"; }
# папка резервной копии ALD Pro
aldpro_backups="/var/backups/aldpro/"
aldpro_version="$(cat /etc/apt/sources.list.d/aldpro.list | cut -d '/' -f 7 | cut -d ' ' -f 1)"
log "Начато создание РК ${app} ${aldpro_version} ${HOSTNAME} ${now}"

# Название директории для резервной копии формируется
# из текущей даты, версии и находится в папке $aldpro_backups
BACKUP_PATH="${aldpro_backups}${now}-${aldpro_version}"

log "Создание временной директории для резервных копий $BACKUP_PATH"
mkdir -p $BACKUP_PATH
log "Остановка затрагиваемых бэкапом сервисов"
systemctl stop apache2 tftpd-hpa postgresql aldpro-salt-minion
log "Архивирование PostgreSQL"
tar -zcvf $BACKUP_PATH/postgresql.tar.gz /var/lib/postgresql/
log "Архивирование логов"
tar -zcvf $BACKUP_PATH/log.tar.gz --exclude=faillog --exclude=lastlog /var/log/
log "Архивирование директории etc"
tar -zcvf $BACKUP_PATH/etc.tar.gz /etc/
log "Архивирование директории ipa-client"
tar -zcvf $BACKUP_PATH/ipa-client.tar.gz /var/lib/ipa-client/
log "Архивирование директории tftp"
tar -zcvf $BACKUP_PATH/tftp.tar.gz /var/www/tftp/
log "Запуск затрагиваемых бэкапом сервисов"
systemctl start apache2 tftpd-hpa postgresql aldpro-salt-minion

# Вместо /mnt/ вы можете настроить свою директорию (облако или сетевой диск)
log "Копируем директорию резервной копии на другой носитель"
cp -r $BACKUP_PATH /mnt/

log "Удаляем резервные копии старше 30 дней для ротации"
find "${aldpro_backups}" -type d -mtime +30 -exec rm -rf {} \;
log "Создание копии ${app} завершено!"

Для восстановления подсистемы PXE создадим файл restore_pxe.sh в домашней папке root с таким содержимым:

#!/bin/bash
app="$(echo $0 | cut -d '/' -f 2 )"
help="Для запуска восстановления нужно указать папку аргументом\n ./${app} DATE-DIR"
aldpro_backups="/var/backups/aldpro/"
# функция логирования
function log() { logger -t "$app" "$1"; echo "$1";  }
function err() { logger --priority user.error -t "$app" "$1"; echo -e "\033[0;31m$1\033[0m";  }
# проверка наличия аргумента папки РК для восстановления
if [[ -z "$1" ]]; then
   err "Ошибка! Нет аргумента в виде папки!"
   echo -e "\n$help"
   echo -e "\nСписок доступных резервных копий:"
   ls "$aldpro_backups"
   exit 1
fi
RESTORE_PATH="${aldpro_backups}$1"
# Перейти в директорию с резервными копиями
cd $RESTORE_PATH
# Получаем ошибку если нет такой директории резервной копии
check_backup=$?
# Проверим дату бекапа в аргументе, иначе выведем список дат для удобства
if [[ "$check_backup" -gt 0 ]]; then
   err "Ошибка! Нет $RESTORE_PATH резервной копии!"
   echo "Выберите дату резервной копии:"
   ls "$aldpro_backups"
   exit "$check_backup"
fi
log "Начато восстановление $RESTORE_PATH резервной копии!"
set -e # для возмоности отмены Ctrl+Z и если ошибка, то выход будет сразу
log "Остановка затрагиваемых восстановлением сервисов"
systemctl stop apache2 tftpd-hpa postgresql aldpro-salt-minion
log "Восстановление БД PostgreSQL"
tar -C "/" -xvf postgresql.tar.gz
log "Восстановление логов"
tar -C "/" -xvf log.tar.gz
log "Восстановление директории etc"
tar -C "/" -xvf etc.tar.gz
log "Восстановление ipa-client"
tar -C "/" -xvf ipa-client.tar.gz
log "Восстановление директории tftp"
tar -C "/" -xvf tftp.tar.gz

log "Восстановление завершено. Перезагрузка!"
sleep 5 && reboot

Подсистема мониторинга

Для выполнения резервного копирования подсистемы мониторинга создадим файл backup_mon.sh в домашней папке root с таким содержимым:

#!/usr/bin/env bash
now="$(date +'%Y-%m-%dT%H-%M-%S')"
app="$(echo $0 | cut -d '/' -f 2 )"
# функция логирования
function log() { logger -t "$app" "$1"; echo "$1"; }
# папка резервной копии ALD Pro
aldpro_backups="/var/backups/aldpro/"
aldpro_version="$(cat /etc/apt/sources.list.d/aldpro.list | cut -d '/' -f 7 | cut -d ' ' -f 1)"
log "Начато создание РК ${app} ${aldpro_version} ${HOSTNAME} ${now}"

# Название директории для резервной копии формируется
# из текущей даты, версии и находится в папке
BACKUP_PATH="${aldpro_backups}${now}-${aldpro_version}"

log "Остановка затрагиваемых бэкапом сервисов"
systemctl stop apache2 zabbix-agent zabbix-server postgresql aldpro-salt-minion
log "Архивирование директории ipa-client"
tar -zcvf $BACKUP_PATH/ipa-client.tar.gz /var/lib/ipa-client/
log "Архивирование логов"
tar -zcvf $BACKUP_PATH/log.tar.gz --exclude=faillog --exclude=lastlog /var/log/
log "Архивирование директории etc"
tar -zcvf $BACKUP_PATH/etc.tar.gz /etc/
log "Архивирование zabbix"
tar -zcvf $BACKUP_PATH/zabbix.tar.gz /usr/share/zabbix/
log "Архивирование БД PostgreSQL"
tar -zcvf $BACKUP_PATH/postgresql.tar.gz /var/lib/postgresql/
# архивирование логов
log "Архивирование логов"
tar -zcvf $BACKUP_PATH/log.tar.gz --exclude=faillog --exclude=lastlog /var/log/

log "Запуск затрагиваемых бэкапом сервисов"
systemctl start apache2 zabbix-agent zabbix-server postgresql aldpro-salt-minion

# Вместо /mnt/ вы можете настроить свою директорию (облако или сетевой диск)
log "Копируем директорию резервной копии на другой носитель"
cp -r $BACKUP_PATH /mnt/

log "Удаляем резервные копии старше 30 дней для ротации"
find "${aldpro_backups}" -type d -mtime +30 -exec rm -rf {} \;
log "Создание копии ${app} завершено!"

Для восстановления подсистемы мониторинга создадим файл restore_mon.sh в домашней папке root с таким содержимым:

#!/bin/bash
app="$(echo $0 | cut -d '/' -f 2 )"
help="Для запуска восстановления нужно указать папку аргументом\n ./${app} DATE-DIR"
aldpro_backups="/var/backups/aldpro/"
# функция логирования
function log() { logger -t "$app" "$1"; echo "$1";  }
function err() { logger --priority user.error -t "$app" "$1"; echo -e "\033[0;31m$1\033[0m";  }
# проверка наличия аргумента папки РК для восстановления
if [[ -z "$1" ]]; then
   err "Ошибка! Нет аргумента в виде папки!"
   echo -e "\n$help"
   echo -e "\nСписок доступных резервных копий:"
   ls "$aldpro_backups"
   exit 1
fi
RESTORE_PATH="${aldpro_backups}$1"
# Перейти в директорию с резервными копиями
cd $RESTORE_PATH
# Получаем ошибку если нет такой директории резервной копии
check_backup=$?
# Проверим дату бекапа в аргументе, иначе выведим список дат для удобства
if [[ "$check_backup" -gt 0 ]]; then
   err "Ошибка! Нет $RESTORE_PATH резервной копии!"
   echo "Выберите дату резервной копии:"
   ls "$aldpro_backups"
   exit "$check_backup"
fi
log "Начато восстановление $RESTORE_PATH резервной копии!"
set -e # для возмоности отмены Ctrl+Z и если ошибка, то выход будет сразу
log "Остановка затрагиваемых бэкапом сервисов"
systemctl stop apache2 zabbix-agent zabbix-server postgresql aldpro-salt-minion
log "Восстановление БД PostgreSQL"
tar -C "/" -xvf postgresql.tar.gz
log "Восстановление ipa-client"
tar -C "/" -xvf ipa-client.tar.gz
log "Восстановление директории etc"
tar -C "/" -xvf etc.tar.gz
log "Восстановление директории zabbix"
tar -C "/" -xvf zabbix.tar.gz
log "Восстановление логов"
tar -C "/" -xvf log.tar.gz

log "Восстановление завершено. Перезагрузка!"
sleep 5 && reboot

Подсистема журналирования

Для выполнения резервного копирования подсистемы журналирования создадим файл backup_audit.sh в домашней папке root с таким содержимым:

#!/usr/bin/env bash
now="$(date +'%Y-%m-%dT%H-%M-%S')"
app="$(echo $0 | cut -d '/' -f 2 )"
# функция логирования
function log() { logger -t "$app" "$1"; echo "$1"; }
# папка резервной копии ALD Pro
aldpro_backups="/var/backups/aldpro/"
aldpro_version="$(cat /etc/apt/sources.list.d/aldpro.list | cut -d '/' -f 7 | cut -d ' ' -f 1)"
log "Начато создание РК ${app} ${aldpro_version} ${HOSTNAME} ${now}"
# Название директории для резервной копии формируется
# из текущей даты, версии и находится в папке ${aldpro_backups}
BACKUP_PATH="${aldpro_backups}${now}-${aldpro_version}"
log "Создание временной директории для резервных копий $BACKUP_PATH"
mkdir -p $BACKUP_PATH
# Архивирование логов
tar --exclude='/var/log/lastlog' --exclude='/var/log/wtmp' -zcvf $BACKUP_PATH/log.tar.gz /var/log/
# Архивирование директории etc
tar -zcvf $BACKUP_PATH/etc.tar.gz /etc/
# Архивирование директории ipa-client
tar -zcvf $BACKUP_PATH/ipa-client.tar.gz /var/lib/ipa-client/

# Вместо /mnt/ вы можете настроить свою директорию (облако или сетевой диск)
log "Копируем директорию резервной копии на другой носитель"
cp -r $BACKUP_PATH /mnt/

log "Удаляем резервные копии старше 30 дней для ротации"
find "${aldpro_backups}" -type d -mtime +30 -exec rm -rf {} \;
log "Создание копии ${app} завершено!"

Для восстановления создадим файл restore_audit.sh в домашней папке root с таким содержимым:

#!/bin/bash
app="$(echo $0 | cut -d '/' -f 2 )"
help="Для запуска восстановления нужно указать папку аргументом\n ./${app} DATE-DIR"
aldpro_backups="/var/backups/aldpro/"
# функция логирования
function log() { logger -t "$app" "$1"; echo "$1";  }
function err() { logger --priority user.error -t "$app" "$1"; echo -e "\033[0;31m$1\033[0m";  }
# проверка наличия аргумента папки РК для восстановления
if [[ -z "$1" ]]; then
   err "Ошибка! Нет аргумента в виде папки!"
   echo -e "\n$help"
   echo -e "\nСписок доступных резервных копий:"
   ls "$aldpro_backups"
   exit 1
fi
RESTORE_PATH="${aldpro_backups}$1"
# Перейти в директорию с резервными копиями
cd $RESTORE_PATH
# Получаем ошибку если нет такой директории резервной копии
check_backup=$?
# Проверим дату бекапа в аргументе, иначе выведем список дат для удобства
if [[ "$check_backup" -gt 0 ]]; then
   err "Ошибка! Нет $RESTORE_PATH резервной копии!"
   echo "Выберите дату резервной копии:"
   ls "$aldpro_backups"
   exit "$check_backup"
fi
log "Начато восстановление $RESTORE_PATH резервной копии!"
set -e # для возмоности отмены Ctrl+Z и если ошибка, то выход будет сразу

log "Остановка затрагиваемых восстановлением сервисов"
systemctl stop syslog-ng aldpro-salt-minion
log "Восстановление логов"
tar -C "/" -xvf log.tar.gz
log "Восстановление директории etc"
tar -C "/" -xvf etc.tar.gz
log "Восстановление ipa-client"
tar -C "/" -xvf ipa-client.tar.gz

log "Восстановление завершено. Перезагрузка!"
sleep 5 && reboot

Настройка регулярного резервного копирования через CRON

Допустим, мы создали скрипт /root/backup_dc.sh для резервного копирования контроллера домена и хотим запускать его регулярно в нерабочие часы. Для этого мы можем настроить планировщик заданий cron.

Чтобы перейти к редактированию конфигурационного файла cron, выполните команду sudo crontab -e. Задания cron задаются в следующем синтаксисе:

минута час день_месяца месяц день_недели команда

Где:

  • минута — значение от 0 до 59, которое указывает, на какой минуте в пределах часа должна быть выполнена указанная команда.

    Например, значение 5 означает, что задание требуется выполнить на 5-й минуте.

    Если указать символ «*», то задание будет выполняться каждую минуту. Если указать «*/5», то задание будет выполняться через каждые 5 минут.

  • час — значение от 0 до 23, которое указывает, в каком часу в пределах суток должна быть выполнена команда. Например, значение 4 означает, что задание нужно выполнять в 4 часа ночи.

    Так же как с минутами, символ «*» означает, то задание будет выполняться каждый час, а если указать «*/4», то через каждые 4 часа.

  • день_месяца — значение от 1 до 31, которое указывает, в какой день месяца нужно выполнять задание. Например, значение 3 означает, что задание нужно выполнять 3-го числа каждого месяца. Если указать «*», то задание не будет привязано к дням месяца.

  • месяц — значение от 1 до 12, которое указывает, в каком месяце требуется выполнять задание. Например, значение 2 означает, что задание нужно выполнять в феврале. Если указать «*», то задание не будет привязано к месяцам года.

  • день_недели — значение от 0 до 6, которое указывает, по каким дням недели нужно выполнять задание. Отсчет начинается с воскресенья (0) и заканчивается субботой (6). Например, значение 1 означает, что задание нужно выполнять по понедельникам.

    Вместо цифр можно использовать названия дней недели в формате SUN, MON и т.д. Если указать «*», то задание не будет привязано к дням недели.

  • команда — задает команду, которая должна выполняться по указанному расписанию. Может содержать полный путь к файлу, параметры, инструкции перенаправления вывода. Если используются пробелы, команду лучше ограничить кавычками.

Приведем несколько полных примеров:

  • Например, если мы захотим запускать скрипт в час ночи, то нужно ввести строку:

0 1 * * * /root/backup_dc.sh
  • Если нужно запускать скрипт в час ночи, но только по воскресениям:

0 1 * * sun /root/backup_dc.sh
  • Если вы хотите запускать скрипт в час ночи, но только один раз в месяц 1-го числа:

0 1 1 * * /root/backup_dc.sh

Практика и тестирование

Заключение

Вот мы и подошли к завершению. Осталось только понять, как можно интегрировать дополнительные информационные системы с каталогом, чтобы извлечь максимум выгоды от внедрения каталога.

Дополнительные источники информации

  • Отсутствуют

Обратная связь

Если остались вопросы, то их всегда можно задать в специальной теме.