[RUBY] Создание резервных копий MikroTik

Количество сетевого оборудования MikroTik достигло критической массы и я стал задумываться об автоматизации процесса резервного копирования конфигураций.

Задача

  • Обеспечить резервное копирование конфигураций, множества роутеров на базе MikroTik.
  • Обеспечить загрузку и хранение резервных копий.

Решение

После раздумий, был написан скрипт который по средствам SSH создавал резервную копию конфигурации и далее с помощью SFTP загружает созданный файл в локальное хранилище.

После недолгих испытаний была замечена одна особенность — если создавать резервную копию в виде «скрипта» (*.rsc), то в некоторых случаях роутер очень долго думает над этим процессом. Также было замечено что такое происходит в случае если есть настройки «проброса портов» или «PPTP». Я так и не понял с чем связанна данная проблема но склонен думать что проблема где-то в парсинге у самой MikroTik OS.

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

В результате с MikroTik-ом получается такая схема:

Резервные копии всех конфигураций собираются на компьютер администратора, в каталог с GIT репозиторием, там просматриваются на наличие и «качество» изменений и если всё впорядке то делается новый «коммит» в репозиторий (не автоматически, работа с гит любая удобная оболочка).

Именно из-за использование такого метода контроля за конфигурациями и был выбран формат резервных копий в виде *.rsc скриптов, а не бинарного файла.

По следам тестов и обходу граблей, был написан GEM для Ruby.

Процесс

Для начала необходимо установить GEM

1
gem install mikrotik-backup

В процессе установится ещё три GEM-а из зависимостей.

Сам скрипт может выглядеть следующим образом

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
require 'mikrotik-backup'

#Time format
time = Time.now.strftime("%d-%m-%Y")

#Config
# name - associate host name (and name backup file)
# host - host address
# user - user name
# password - user password
# path - local folder for save backup file. "/var/backup/"
# format - backup file format, 'binary' or 'script'
config = [
    {name:"Router1-#{time}", host: '10.10.10.1', user:'admin', password:'admin', path:'./', format:'binary'},
    {name:"Router2-#{time}", host: '10.10.10.2', user:'admin', password:'admin', path:'./', format:'script'}
]


backup = MTik_backup.new(config)
# Start backup
backup.backup_and_download

В переменной «config» описываются данные для подключения к оборудованию.

Имена говорят сами за себя и заострить внимание хотелось бы только на «name»,»path» и «format».

«Name» — ассоциативное имя, значение из этого поля будет применяться в именовании файлов, в данном случае имя файла будет «Router1-02-02.2015″

«Path» — путь к каталогу в который будут загружаться резервные копии. Указывается для каждого устройства отдельно, что даёт возможность разложить по «папочкам» все копии. Каталоги необходимо создать заранее.

«Format» — формат сохранения резервной копии, может быть или ‘binary’ или ‘script’. Если вы просто сохраняете файлы по датам, то лучшим выбором будет бинарный фармат, если выбираете формат ‘script’ то получаете возможность удобного сравнения и просмотра но о проблемах производительности я писал выше (время сохранение может достигать 5-10 минут, это проблема самого MikroTik).

Логи

По умолчанию, в консоль будут выводится только сообщения об ошибках и если необходимо выводить полный лог работы то скрипт необходимо привести к следующему виду

1
2
3
4
5
backup = MTik_backup.new(config)
# Log
backup.logger(Logger::DEBUG)
# Start backup
backup.backup

В таком виде, скрипт будет выводить полную информацию о процессе.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[2015-02-11 13:01:32] INFO: SSH connect to host 192.168.1.1
[2015-02-11 13:01:36] INFO: Backup MikroTik configuration
[2015-02-11 13:01:37] INFO: SFTP connect to host 192.168.1.1
[2015-02-11 13:01:38] INFO: Download file Router1-11-02-2015.backup to ./Router1-11-02-2015.backup
[2015-02-11 13:01:38] INFO: SSH connect to host 176.xxx.xxx.28
[2015-02-11 13:01:38] INFO: Backup MikroTik configuration
[2015-02-11 13:01:39] INFO: SFTP connect to host 176.xxx.xxx.28
[2015-02-11 13:01:39] INFO: Download file Router2-11-02-2015.backup to ./Router2-11-02-2015.backup
[2015-02-11 13:01:39] INFO: SSH connect to host 188.xxx.xxx.56
[2015-02-11 13:01:40] INFO: Backup MikroTik configuration
[2015-02-11 13:01:41] INFO: SFTP connect to host 188.xxx.xxx.56
[2015-02-11 13:01:41] INFO: Download file Router3-11-02-2015.backup to ./Router3-11-02-2015.backup
[2015-02-11 13:01:41] INFO: SSH connect to host 188.xxx.xxx.74
[2015-02-11 13:01:42] INFO: Backup MikroTik configuration
[2015-02-11 13:01:42] INFO: SFTP connect to host 188.xxx.xxx.74
[2015-02-11 13:01:43] INFO: Download file Router4-11-02-2015.backup to ./Router4-11-02-2015.backup

Если необходимо выводить лог в файл, то строку

1
backup.logger(Logger::DEBUG)

необходимо заменить на:

1
backup.logger(Logger::DEBUG,'backup.log')

Прошу о багах и т.д. сообщать тут или на GitHub.

Комментарии