Smart mikrotik backup

Как часто нужно делать резеврную копию миротика? Раз в день? Раз в месяц? На мой взгляд идеально делать бэкап каждый раз после того как вы делаете какие-либо изменения.

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

Для автоматизации я буду использовать bash скрипт, а запускать его с ubuntu.

Основные моменты:

  • процесс должен происходить автономно
  • бэкап должен запускаться только если были изменения

Как это можно сделать? С пощью SSH и комманды export на микротике. Первым делом необходим будет добавить ключи — здесь описано как.

Затем я бы порекомендовал GIT что бы отслеживать изменения, но это на ваше усмотрение.

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

ssh имя_пользователя_на_микротике@адрес_микротика

Если мы попали в консоль на микротике, значит всё отлично. Второй этап подготовка данных для отправки бэкапов с mikrotik. Я буду делать это по e-mail. Хотя конечно можно так же через SCP файлы стягивать. Нам понадобится логин, пароль, адрес сервера, порт для SMTP, адрес получателя, адрес отправителя и наличие шифрования.

Принцип скрипта:

  1. Заполняем переменные
  2. Работаем по списку адресов mikrotik (цикл for, перечисляем адреса через пробел);
  3. Если файл с адресом миротика не существует — просто загружаем конфиг, отрезаем от него первую строчку и сохраняем;
    Отрезать первую строчку необходим потому что она меняется даже если настройки не поменялись;
  4. Если файл существует, загружаем текущую конфигурацию и сравниваем её с ранее сохранённой с помощью комманды Diff;
  5. Проверяем на изменения в случае отсутствия — работаем со следующим адресом. Если есть изменения, заменяем сохранённый конфиг на новый, запускаем процесс бэкапа и отправки на e-mail;
  6. Изменившиеся строчки складываем в файл;
  7. Когда все адреса перебраны, запускаем git add, commit and push. Отправляем список изменений на e-mail.
Важный момент. Если не было изменений на микротике, то скрипт не будет вызывать «лишние» записи на флэш, export verbose использует только оперативную память.

Собственно сам скрипт:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/bin/bash
 
# mail settings
# имя пользователя
MUser="mktk-backup"
MPass="VeryH@rdP@$$80Rd"
# сервер smtp
MAddr="smtp.yandex.ru"
MPort=465
# кому отправляем
MTo="destination@backup.com"
# от кого отправляем
MFrom="mktk-backup@yandex.ru"
# используется ли start-tls
MTls="yes"
 
# генерируем уникальное имя
Stamp=`date +"mikrotik_%y_%m_%d_%s"`
 
# дирректория с сохранёнными конфигами
DirC="/home/alexey/mikrotik"
 
# имя пользователя на микротике
User="alexey"
 
# пароль на бэкапы
BPass="V8r!Str@@@ng"
 
cd $DirC
# создаём временную папку
mkdir -p /tmp/$Stamp
 
 
# список маршрутизаторов через пробел
for Router in 192.168.0.1 192.168.0.183
do
  # проверяем существует ли старый конфиг
  if [ -f "$DirC/$Router" ]
  then
    echo "$DirC/$Router exist"
    # если существует загружаем новый
    ssh $User@$Router "export verbose" > /tmp/$Stamp/$Router
    # отрезаем от него первую строчку
    tail -n +2 /tmp/$Stamp/$Router > /tmp/$Stamp/cut$Router
    # выполянем Diff
    Diff=`diff -td --suppress-blank-empty --suppress-common-lines $DirC/$Router /tmp/$Stamp/cut$Router`
    # Если есть различия
    if [ -n "$Diff" ]
    # заменяем старый конфиг на текущий и делаем запись в файле отличий
    then
      cp /tmp/$Stamp/cut$Router $DirC/$Router
      echo "@@@@@@ $Router @@@@@" >>  /tmp/$Stamp/Diff
      echo $Diff >> /tmp/$Stamp/Diff
      # получаем имя микротика (можно установить в System - Identity)
      MIdent=`ssh $User@$Router ":put [/system identity get name]" | tr -d '\r'`
      # создаём бэкап на микротике
      ssh $User@$Router "/system backup save encryption=aes-sha256 password=$BPass name=$MIdent-$Stamp"
      # отправляем его на почту
      ssh $User@$Router "/tool e-mail send start-tls=$MTls from=$MFrom password=$MPass to=$MTo user=$MUser server=$MAddr subject=\"Backup Mikrotik $Stamp $MIdent $Router\" body=backup_file_$Mident_$Router port=$MPort file=$MIdent-$Stamp.backup"
      # удаляем файл бэкапа
      ssh $User@$Router "/file remove $MIdent-$Stamp.backup"
    fi
  else
    # если исходного (старого) конфиг файла не существует
    echo "$DirC/$Router not exist"
    # просто создаём его
    ssh $User@$Router "export verbose" > /tmp/$Stamp/$Router
    tail -n +2 /tmp/$Stamp/$Router > $DirC/$Router
    # получаем имя микротика (можно установить в System - Identity)
    MIdent=`ssh $User@$Router ":put [/system identity get name]" | tr -d '\r'`
    # создаём бэкап на микротике
    ssh $User@$Router "/system backup save encryption=aes-sha256 password=$BPass name=$MIdent-$Stamp"
    # отправляем его на почту
    ssh $User@$Router "/tool e-mail send start-tls=$MTls from=$MFrom password=$MPass to=$MTo user=$MUser server=$MAddr subject=\"Backup Mikrotik $Stamp $MIdent $Router\" body=backup_file_$Mident_$Router port=$MPort file=$MIdent-$Stamp.backup"
    # удаляем файл бэкапа
    ssh $User@$Router "/file remove $MIdent-$Stamp.backup"
    echo "Added new $Router to config repository" >> /tmp/$Stamp/Diff
  fi
done
 
# если существует файл
if [ -f /tmp/$Stamp/Diff ]
# то обновляем репозиторий
then
  cd $DirC
  git add . && git commit -m "$Stamp" && git push
  # и отправляем емайл
  # отрезаем кривые символы, иначе письмо без текста придёт
  MBody=`cat /tmp/$Stamp/Diff | tr '\n' '\r' | tr '"' '*'`
  MSubj="Mikrotik have new changes in config $Stamp"
  # Внимание!! Здесь используется адрес микротика.
  ssh $User@192.168.0.1 "/tool e-mail send start-tls=$MTls from=$MFrom password=$MPass to=$MTo user=$MUser server=$MAddr subject=\"$MSubj\" body=\"$MBody\" port=$MPort"
fi
# удаляем временную папку и файлы в ней
rm /tmp/$Stamp -rf


Собственно всё, добавляем скрипту право на выполнение, добавляем в крон.

Git предлагаю использовать потому что он отлично умеет ОТСЛЕЖИВАТЬ изменения.

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

Если не используете GIT просто закомментируйте в скрипте 1 строчку с ним.