MikroTik backup на ftp

 

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

 

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

 

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

 

#Резервное копирование конфигурации Mikrotik

#Получаем дату в формате дд-мм-гггг

 

:local tmpdate [/system clock get date];

:local months ("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");

:local month [ :pick $tmpdate 0 3 ];

:local mm ([ :find $months $month -1 ] + 1);

:if ($mm < 10) do={ :set mm ("0" . $mm); }

:local date ([:pick $tmpdate 4 6] ."-" . $mm ."-" . [:pick $tmpdate 7 11])

 

#Задаем переменные и параметры доступа к FTP

 

:local myname "M2-hAP-ac-lite"

:local fname ($myname."_".$date);

:local bname ($myname."_".$date.".backup");

:local ename ($myname."_".$date.".rsc");

:local ftpuser "mikrotik";

:local ftppass "mYPa$$word";

:local ftpaddr "203.0.113.21";

 

#Выгружаем настройки

 

/system backup save name=$fname password=BackPa$$word;

:delay 10;

/export file=$fname

:delay 10;

 

#Загружаем конфигурацию на FTP

 

/tool fetch address=$ftpaddr src-path=$bname user=$ftpuser password=$ftppass port=21 upload=yes mode=ftp dst-path=$bname

:delay 15;

/tool fetch address=$ftpaddr src-path=$ename user=$ftpuser password=$ftppass port=21 upload=yes mode=ftp dst-path=$ename

:delay 15;

 

#Удаляем файлы с устройства

 

/file remove $bname;

/file remove $ename;

 

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

 

Затем задаем переменные. Как можно заметить, мы задали несколько переменных с именами файлов. Этого можно было не делать и формировать нужные имена прямо в скрипте, но в этом случае сильно страдает его читабельность. Мы не советуем этим пренебрегать, потому что впоследствии, когда подробности уже забудутся, разобраться с сложном скрипте будет сложнее, нежели в простом.

 

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

 

Теперь перейдем на целевое устройство: System - Scripts и создадим новый скрипт:

 

 

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

 

Для того, чтобы отличать конфигурации друг от друга задайте уникальную переменную myname. Лично мы используем следующий шаблон:

 

[идентификатор организации/места нахождения устройства] - [наименование устройства]

 

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

 

После того, как вы создали скрипт его следует проверить, нажмите Run Script и убедитесь, что он делает все как вам надо. Обязательно проверьте со стороны FTP что файлы приходят и их можно восстановить.

 

Все работает? Отлично! Самое время добавить его в планировщик. Откроем System - Scheduler и добавим новое задание:

 

 

Имя задания может быть любым, а вот остальные опции нуждаются в пояснениях. Прежде всего определимся, с какой частотой мы хотим делать копии. Лично мы делаем резервное копирование раз в неделю, по воскресениям. Поэтому в Start Date указываем дату прошлого воскресения, в Start Time - время начала выполнения задания, в нашем случае - десять минут после полуночи. В поле Interval указываем периодичность повторения задания - ровно 7 дней.

 

Выставляем политики как на скриншоте, что снова некритично, и в поле On Event указываем команду запуска созданного нами скрипта:

 

/system script run backup_to_ftp

 

где backup_to_ftp - его имя.

 

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

 

Другой вариант скрипта.

 

{

:log info "Starting Backup Script...";

:local sysname [/system identity get name];

:local sysver "model_ustroystva_ili_mesto_ustanovki";

:local ftpuser "ftp_user_name";

:local ftppass "ftp_password";

:local ftpaddr "ftp_ip";

:log info "Deleting last Backups...";

:foreach i in=[/file find] do={:if ([:typeof [:find [/file get $i name] \

"$sysname-"]]!="nil") do={/file remove $i}};

:delay 5;

:local backupfile ("$sysname-$sysver_" . \

[:pick [/system clock get date] 7 11] . [:pick [/system \

clock get date] 0 3] . [:pick [/system clock get date] 4 6] . ".backup");

:log info "Creating new Full Backup file...";

/system backup save name=$backupfile;

:delay 5;

:local exportfile ("$sysname-$sysver_" . \

[:pick [/system clock get date] 7 11] . [:pick [/system \

clock get date] 0 3] . [:pick [/system clock get date] 4 6] . ".rsc");

:log info "Creating new Setup Script file...";

/export file=$exportfile;

:delay 5;

/tool fetch user=$ftpuser password=$ftppass upload=yes address=$ftpaddr src-path=$backupfile mode=ftp dst-path=$backupfile;

:delay 5;

/tool fetch user=$ftpuser password=$ftppass upload=yes address=$ftpaddr src-path=$exportfile mode=ftp dst-path=$exportfile;

:log info "Backuping completed.";

}