4 minute read

Будем 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.