SCROLL
Среднее время на прочтение: 3 мин.

Автоматизация создания бекапов с устройств Mikrotik на Linux

Опишу свой метод резервного копирония своих устройств Mikrotik.

Создавать бекапы оборудования Mikrotik будем с помощью bash-скрипта. Входе выполнения скрипта, будет осуществлен прозрачный вход на оборудование Mikrotik (как настроить прозрачное подключение к Mikrotik по ssh читаем в этой статье).

Так же бекапы будем хранить на сетевом ресурсе, поэтому в примере скрипта будет выполнено монтирование сетевого диска.

Предполагается создание бекапа не одного устройства Mikrotik, поэтому подготовим заранее текстовый файл со списком IP-адресов всех устройств Mikrotik, которых хотим делать бекап

cat << EOF > /opt/mikrotik
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7
EOF

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

Bash
#!/bin/bash

#################################
# Переменные для работы скрипта #
#################################
# Значение текущей даты
date=$(date +%d-%m-%Y)
# Значение текущего времени
time=$(date +%H-%M)
# Имя пользователя для подключения к Mikrotik
username="admin"
# Путь к файлу с ip адресами оборудований
mikrotik="/home/admin/adress_mikrotik"
# Временная папка
tmp="/home/admin/mikrotik/"
# Логи
log=$tmp"/log.txt"
#-------------------------------#
# Хранилище бекапов
smb_path_backup="//192.168.1.2/Backups"
# Название домена (Верхний вегистр)
domain="JAKONDA.LOCAL"
# Имя пользователя
usrname="jakonda"
# Пароль
passwd="Aa1234567"
########################################
# Рабочий листинг бекапа Спартака #
########################################
# Перебираем циклом файл с адресами оборудования и делаем бекапы по каждому из них
for i in $( cat $mikrotik ); do
# Создаем временную папку для работы скрипта
mkdir -p $tmp"/"$i
# Получаем имя оборудования
RESULT=$(ssh $username"@"$i "system identity print" | awk ' {print $2} ');
echo "Начало резервного копирования оборудования Mikrotik"
echo "Начало резервного копирования оборудования Mikrotik ($time) $RESULT" > $log
# Создаем бекап оборудования
echo "Создание бекапа оборудования $i..."
ssh $username"@"$i "system backup save name=backup";
if [ $? -eq 0 ]; then
echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"
echo "Создание бекапа $i успешно ($time)" >> $log
echo
else
echo -n "$(tput hpa $(tput cols))$(tput cub 6)[ОШИБКА]"
echo "Создание бекапа $i неудачно ($time)" >> $log
echo
fi

# Создаем текстовый файл конфигурации
echo "Создание бекапа текстового файла конфигурации оборудования $i..."
ssh $username"@"$i "export file=backup.rsc";
if [ $? -eq 0 ]; then
echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"
echo "Создание бекапа текстового файла конфигурации $i успешно ($time)" >> $log
echo
else
echo -n "$(tput hpa $(tput cols))$(tput cub 6)[ОШИБКА]"
echo "Создание бекапа текстового файла конфигурации $i неудачно ($time)" >> $log
echo
fi
# Создаем каталог для бекапа оборудования
echo "Создаем директорию для размещения бекапа..."
mkdir -p $tmp/$i/$date/
echo "Создана временная директория для размещения бекапа с оборудовнаия $i ($time)" >> $log

# Скачивание созданных файлов бекапов с оборудования
echo "Скачивание полученных бекап файлов с оборудования $i..."
sftp $username"@"$i":backup.backup" $tmp/$i/$date/$i"-"$time".backup";
sftp $username"@"$i":backup.rsc" $tmp/$i/$date/$i"-"$time".rsc";
if [ $? -eq 0 ]; then
echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"
echo "Скачивание бекапов с оборудования $i успешно ($time)" >> $log
echo
else
echo -n "$(tput hpa $(tput cols))$(tput cub 6)[ОШИБКА]"
echo "Скачивание бекапов с оборудования $i неудачно ($time)" >> $log
echo
fi

# Архивируем полученный бекап
echo "Архивация бекапов..."
cd $tmp/$i/
RESULT=$(tar -czvf $date".tar.gz" $date)
echo "Бекапы за архивированны ($time)" >> $log

# Подключаем сетевое хранилище
echo "Подключение сетевого хранилища $smb_path_backup..."
RESULT=$(cat /home/admin/sudos | sudo -S -u root mount -t cifs $smb_path_backup /mnt/samba -o username=$usrname,password=$passwd,domain=$domain)
echo "Сетевое хранилище $smb_path_backup подключено ($time)" >> $log

# Создаем каталог для размещения бекапа в сетевом хранилище, если он не создан.
echo "Создаем каталог для размещения бекапов оборудоваия $i..."
RESULT=$(cat /home/admin/sudos | sudo -S -u root mkdir -p /mnt/samba/Mikrotik/$i)
echo "Каталог для размещения бекапов оборудования $i в сетевом хранилище создан ($time)" >> $log

# Перемещаем созданный архив в хранилище
echo "Размещение бекапов в сетевом хранилище..."
RESULT=$(cat /home/admin/sudos | sudo -S -u root mv $tmp/$i/$date".tar.gz" "/mnt/samba/Mikrotik/$i/$date.tar.gz")
echo "Бекапы оборудования $i перемещены в "$smb_path_backup"/$i ($time)" >> $log
echo "" >> $log

# Перемещаем лог файл в папку с бекапом
RESULT=$(cat /home/admin/sudos | sudo -S -u root mv $log "/mnt/samba/MIkrotik/$i/$date.log.txt")

# Подчишаем за собой на оборудование
echo "Удаляем файлы бекапа с оборудования $i"
ssh $username"@"$i "file remove backup.backup";
ssh $username"@"$i "file remove backup.rsc";
rm -r -f $tmp
# Размонтируем сетевой диск
cat /home/admin/sudos | sudo -S -u root umount $smb_path_backup
done

Делаем скрипт исполняемым:

chmod +x backup_mikrotik

Запускаем скрипт и проверяем его работу. В итоге будут созданы папки по каждому оборудованию и в каждой папке будут вот так располагаться бекапы с лог-файлами. 

Добавим в планировщик crontab выполнение его по заданному времени. Выполнять скрипт мы будем каждый день в 23:50

50 23 * * * /home/admin/auto_backup_mikrotik

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

Обсуждение

7 комментариев
  • Hi, me again. I get same result when i was trying to do something on my own 🙁 in new line that you tell me «MIKROTIK_NAME=$RESULT» i got result like MIKROTIK_NAME=$’Company\r’ and whole directory is in mess i found on internet that have something with msdos coding and that windows leave that \r on the end of name when linux try to make folders but like i said early i dont have any skill in scripting so i dont know what to do 🙁 Thank you very much for helping me!

      • Это ответ на комментарий Жаконда

        Hi, me again. Here is some output to see more about problem.

        root@MikroTik-BKP:/home/admin/Mikrotik# ./test.sh
        ++ date +%d-%m-%Y
        + date=26-10-2018
        ++ date +%H-%M
        + time=11-12
        + username=backup
        + mikrotik=/home/admin/Mikrotik/adress_mikrotik
        + tmp=/home/admin/Mikrotik
        + log=/home/admin/Mikrotik/log.txt
        + smb_path_backup=//192.168.1.3/TikBak
        + domain=STORAGE.LOCAL
        + usrname=tik
        + passwd=1234
        ++ cat /home/admin/Mikrotik/adress_mikrotik
        + for i in ‘$( cat $mikrotik)’
        + mkdir -p /home/admin/Mikrotik/
        ++ awk ‘{print $2}’
        ++ ssh backup@192.168.1.88 ‘system identity print’
        + RESULT=$’Company\r’
        + echo ‘Start of backup equipment Mikrotik’
        Start of backup equipment Mikrotik
        ‘ echo ‘Starting Mikrotik hardware backup Mikrotik (11-12) Company
        + MIKROTIK_NAME=$’Company\r’
        + echo ‘Creating hardware backup 192.168.1.88…’
        Creating hardware backup 192.168.1.88…
        + ssh backup@192.168.1.88 ‘system backup save name=backup’
        Configuration backup saved
        + ‘[‘ 0 -eq 0 ‘]’
        +++ tput cols
        ++ tput hpa 237
        ++ tput cub 6
        + echo -n ‘ [OK]’
        [OK]+ echo ‘Creating backup 192.168.1.88 successfully (11-12)’
        + echo

        + echo ‘Creating a backup of the text file configuration hardware 192.168.1.88…’
        Creating a backup of the text file configuration hardware 192.168.1.88…
        + ssh backup@192.168.1.88 ‘export file=backup.rsc’
        + ‘[‘ 0 -eq 0 ‘]’
        +++ tput cols
        ++ tput hpa 237
        ++ tput cub 6
        + echo -n ‘ [OK]’
        [OK]+ echo ‘Creating a backup of the configuration text file 192.168.1.88 successfully (11-12)’
        + echo

        + echo ‘Create a directory to place backup…’
        Create a directory to place backup…
        + mkdir -p $’/home/admin/Mikrotik/Company\r_192.168.1.88/26-10-2018/’
        + echo ‘A temporary directory was created to place a backup with equipment 192.168.1.88 (11-12)’
        + echo ‘Downloading the received backup files from the hardware 192.168.1.88…’
        Downloading the received backup files from the hardware 192.168.1.88…
        + sftp backup@192.168.1.88:backup.backup $’/home/admin/Mikrotik/Company\r_192.168.1.88/26-10-2018/Company\r_192.168.1.88-11-12.backup’
        Connected to 192.168.1.88
        Fetching /backup.backup to /home/admin/Mikrotik/Company
        /backup.backup 100% 191KB 191.3KB/s 00:00
        + sftp backup@192.168.1.88:backup.rsc $’/home/admin/Mikrotik/Company\r_192.168.1.88/26-10-2018/Company\r_192.168.1.88-11-12.rsc’
        Connected to 192.168.1.88.
        Fetching /backup.rsc to /home/admin/Mikrotik/Company
        /backup.rsc 100% 40KB 39.8KB/s 00:00
        + ‘[‘ 0 -eq 0 ‘]’
        +++ tput cols
        ++ tput hpa 237
        ———————————————————————————————————
        I tried in this line
        RESULT=$(ssh $username»@»$i «system identity print» | awk ‘{print $2}’);

        in awk to remove \r and $ whit some command i forgot witch one 🙂 i tried alot and i got clear name in MIKROTIK_NAME=$RESULT but later in this line and alot more lines where is MIKROTIK_NAME

        sftp $username»@»$i»:backup.backup» $tmp/$MIKROTIK_NAME»_»$i/$date/$MIKROTIK_NAME»_»$i»-«$time».backup»;

        i got lot more \r\r than orginal awk command at the and of $MIKROTIK_NAME

        i tried also dos2unix command to file and sed -i ‘s/\r//g’ filename and other similar stuff still no luck 🙁

  • Hehe ok 🙂 i will try. When script makes new folder of mikrotik device from addresss_mikrotik folder name contain only ip address from list «e.g. 192.168.1.88» but i will like when new folder is maid to contain also identity of mikrotik from backup is made. So i would like to have somthing like «e.g. Company_192.168.1.88 Company1_192.168.1.88» so that i know from witch company is mikrotik if its default IP. Thank you for you quick answer i just dont have any knowledge about scripting 🙁

    • Это ответ на комментарий Marko

      Now it`s better to understanding what you want to do))
      Try make changes in code, thats must be good. Sorry check it i cant.

      After line:
      # Получаем имя оборудования
      RESULT=$(ssh $username»@»$i «system identity print» | awk ‘ {print $2} ‘);

      Add code:
      MIKROTIK_NAME=$RESULT

      Then, after that line:
      # Создаем каталог для бекапа оборудования
      echo «Создаем директорию для размещения бекапа…»

      Replace that line:
      mkdir -p $tmp/$i/$date/

      By that:
      mkdir -p $tmp/$MIKROTIK_NAME»_»$i/$date/

      Replace thats lines:
      sftp $username»@»$i»:backup.backup» $tmp/$i/$date/$i»-«$time».backup»;
      sftp $username»@»$i»:backup.rsc» $tmp/$i/$date/$i»-«$time».rsc»;

      By that lines:
      sftp $username»@»$i»:backup.backup» $tmp/$MIKROTIK_NAME»_»$i/$date/$MIKROTIK_NAME»_»$i»-«$time».backup»;
      sftp $username»@»$i»:backup.rsc» $tmp/$MIKROTIK_NAME»_»$i/$date/$MIKROTIK_NAME»_»$i»-«$time».rsc»;

      Replace:
      cd $tmp/$i/

      By:
      cd $tmp/$MIKROTIK_NAME»_»$i/

      Replace that:
      RESULT=$(cat /home/admin/sudos | sudo -S -u root mkdir -p /mnt/samba/Mikrotik/$MIKROTIK_NAME»_»$i)

      By that:
      RESULT=$(cat /home/admin/sudos | sudo -S -u root mkdir -p /mnt/samba/Mikrotik/$MIKROTIK_NAME»_»$i)

      Replace:
      RESULT=$(cat /home/admin/sudos | sudo -S -u root mv $tmp/$MIKROTIK_NAME»_»$i/$date».tar.gz» «/mnt/samba/Mikrotik/$MIKROTIK_NAME»_»$i/$date.tar.gz»)

      By:
      RESULT=$(cat /home/admin/sudos | sudo -S -u root mv $tmp/$MIKROTIK_NAME»_»$i/$date».tar.gz» «/mnt/samba/Mikrotik/$MIKROTIK_NAME»_»$i/$date.tar.gz»)

      Replace:
      RESULT=$(cat /home/admin/sudos | sudo -S -u root mv $log «/mnt/samba/MIkrotik/$MIKROTIK_NAME»_»$i/$date.log.txt»)

      By:
      RESULT=$(cat /home/admin/sudos | sudo -S -u root mv $log «/mnt/samba/MIkrotik/$MIKROTIK_NAME»_»$i/$date.log.txt»)

  • Добрый день! Не совсем понятно что имели ввиду «резервного копирования папки, также содержат личность mikrotik?» Напишите на английском вопрос, посмотрим.

  • Привет, я люблю ваш скрипт, но у меня есть одна проблема 🙁 есть ли какая-либо возможность для резервного копирования папки, также содержат личность mikrotik? Можете ли вы помочь мне с этим? Спасибо! Алос, я использую google translate, так что извините, если что-то неправильно переведено.