Backup’им huawei
Будем backup’ить сетевые устройства huawei средствами VRP и U2000. Напишем ротацию на bash.
1. Из коробки
Huawei умеет бэкапить конфигурацию “из коробки”. Делается это так:
set save-configuration
set save-configuration interval 720 delay 60
set save-configuration backup-to-server server X.X.X.X transport-type ftp user user_name password user_password path path_to_backup_files
Первой командой включаем функцию сохранения конфигурации. Теперь VRP будет периодически проверять конфигурационный файл и выполнять автосохранение только, если зафиксирует изменения. Да, сохраняться конфигурационный файл, сперва, будет на flash-память устройства. Без этого никак. Иногда, автосохранение приносит больше вреда, чем пользы. Но, если отключить, то сохранить конфигурацию на удаленный сервер также не получится. Единственное решение - настроить таймеры.
Второй командой настраиваем таймеры. interval 720 - время в минутах, через которое конфигурация будет сохранена автоматически (минимум - 30, максимум - 43200). delay 60 - если конфигурация была изменена, то auto-save будет выполнен через 60 минут (минимум - 1, максимум - 60). Если не изменять таймеры, то значение по умолчанию для interval - 30 минут, для delay - 5 минут. Здесь же доступна опция cpu-limit, по умолчанию, 50%, это порог, при котором конфигурация автоматически сохраняться не будет.
Третьей командой можно отправлять измененный файл конфигурации (или архив) на удаленный tftp/ftp/sftp сервер. Наш выбор - sftp. Сервер нужно настроить заранее, он должен быть доступен.
Сохранение конфигурации на самом устройстве всегда можно выполнить вручную, командой save. При этом через delay auto-save на удаленный сервер выполнен не будет, а через interval будет, независимо от того, был ли выполнен save на устройстве или нет. А вот если не делать save вручную на устройстве, то либо через interval, либо через delay (в зависимости от того, какой таймер сработает раньше) будет выполнен auto-save и на самом устройстве, и на удаленный сервер.
Файл на удаленный сервер сохраняется в следующем формате - 2019-02-28.18-59-40.your_device_sysname.zip
Файлов на сервере будет много, нужно ротировать. Предположим, что мы не можем использовать logrotate, напишем ротацию на bash, назовем rotationscript.sh и добавим в cron:
#!/bin/sh
# Составим общий список повторяющихся файлов конфигурации для всех устройств.
# Ищем в директории, где храним конфигурационные файлы, все *.zip (если сохраняете в zip),
# сортируем (старые файлы будут сверху), игнорируем первые 42 символа
# (т.к. в выводе будет полный путь до файла, включая дату создания),
# опция -D позволяет вывести все повторяющиеся строки, не изменяя их число,
# добавляем вывод в файл sort.sh.
find /path_to_backup_files/ -name "*.zip" -print | sort | uniq -D -s 42 > /path_to_backup_files/sort.sh
var=0
# Начнем проверку для конкретного устройства.
# С помощью цикла, по порядку, проверяем каждое устройство,
# присваиваем переменной x каждую повторяющуюся строку из списка,
# с помощью cut оставляем только your_device_sysname.zip
for x in $(find /path_to_backup_files/ -name "*.zip" -print | sort | uniq -d -s 42 | cut -d. -f3)
# Присваиваем элементу массива значение переменной x
do Array[$var]=$x
# с помощью цикла считаем число конфигурационных файлов для текущего, проверяемого устройства
for y in $(grep ${Array[$var]} /path_to_backup_files/sort.sh | wc -l)
# будем оставлять только 7 последних файлов конфигурации для каждого устройства.
# Если текущее число меньше, либо равно 7, то выходим из цикла
do if [ $y -le 7 ]
then
break
# иначе запускаем цикл, который оставит только 7 "свежих" файлов конфигурации
# для проверяемого устройства
else
# присваиваем лишнее число файлов конфигурации (все, что > 7) переменной z
z=$(( $y - 7 ))
# удаляем по одному самому "старому" файлу конфигурации для текущего,
# проверяемого устройства
for a in $(grep ${Array[$var]} /path_to_backup_files/sort.sh)
do if [ $z -gt 0 ]
then
rm -f $a
z=$(( $z - 1 ))
else
# выходим из цикла, когда остается 7 "свежих" файлов конфигурации
# для данного устройства
break
fi
done
fi
done
# переходим к проверке следующего устройства
var=$(( $var + 1 ))
done
# очищаем файл со всем списком конфигурационных файлов
> /path_to_backup_files/sort.sh
Если нужно оставлять больше или меньше 7 последних конфигурационных файлов, достаточно изменить число 7 на нужное.
Добавляем скрипту права на исполнение:
chmod +x rotationscript.sh
Добавляем в /etc/crontab для выполнения в указанное время (ежедневно в 00:50):
#minute hour mday month wday who command
50 00 * * * root /path/to/rotationscript.sh
Скрипт будет выполнять ротацию ежедневно, оставляя для каждого устройства не более 7 файлов конфигурации. Хотя файлы конфигурации и небольшие, можно добавить ротацию для файлов, которые хранятся больше 365 дней. Поможет атрибут -mtime 365 для find
2. Из U2000
Настроим U2000 для сохранения файлов конфигурации на удаленный sftp-сервер.
- Administration > Settings > FTP Account Information Management > Configure FTP Account > создаем account для доступа к удаленному sftp-серверу.
- Administration > NE Software Management > NE Backup Policy Management > Default Policy > Modify > Advanced Settings > в поле Destination указываем созданный sftp-account
- Administration > NE Software Management > NE Data Backup/Restoration > выделяем все устройства, пробуем выполнить backup на удалнный sftp-сервер
U2000 создаст дерево каталогов при первом копировании: dc > bak* > X.X.X.*_Y > date_of_backup > vrpcfg.zip + DCInfo_Backupinfo.txt
- *- последний октет ip-адреса устройства. Если он совпадает для нескольких устройств, то такое число каталогов и будет создано
- date_of_backup - имя каталога в виде даты сохранения конфигурации (например, 20191024000015)
- DCInfo_Backupinfo.txt - файл с версией софта устройства
Напишем ротацию для этого метода. Упростим предыдущий скрипт:
#!/bin/sh
# поскольку в названии каталога есть ip-адрес устройств,
# то оставляем только уникальные ip-адреса/каталоги
for x in $(find /path_tobackup_files -name "*.cfg" -o -name "*zip" -print | sort | cut -d_ -f1-3 | uniq -d | cut -d/ -f7)
do y=$(find /path_to_backup_files -name "$x*" -print)
# переходим в такой каталог
cd $y
# для каждой такой директории
for a in $(find $y/* -type d | sort)
# считаем число buckup'ов
do z=$(ls | sort | wc -l)
if [ $z -le 2 ]
# и оставляем последние 2
then
break
# если backup'ов больше 2, удаляем лишние
else
rm -Rf $a
fi
done
done
Добавляем скрипт в crontab.