Автоматизация создания бекапов с устройств 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
Скрипт резервного копирования с комментариями, поэтому разобраться в нем и подставить свои данные не должно составить труда.
#!/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
На этом все можно наслаждаться автоматизацией работы, и у нас всегда будут бекапы которые рано или поздно нас выручат.
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!
I`ll try it to help, as far as possible.
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 🙁
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, так что извините, если что-то неправильно переведено.