[Из песочницы] Mikrotik и Linux. Рутина и автоматизация
Представлюсь, меня зовут Андрей.
Первоначальная задача стояла такая — создать сотни конфигов для Mikrotik, чтобы поднять на каждом ovpn с сертификатом, затем залить на сотни Mikrotik конфиги, а так же сертификаты и ключ.
Пароль от сертификата у каждого уникален. Создавать сотни конфигов руками бред, да и в друг завтра скажут сделать новые или захочется залить еще какие-то изменения на Mikrotik.
Чего я хотел добиться:
- создавать автоматически уйму скриптов;
- автоматически отправить их на нужное мне оборудования;
- быть уверенным в том, что они отработали без ошибок или узнать о том, что конфиг выполнился не корректно.
Используя Bash и FTP все получилось.
В RouterOS можно автоматически выполнять скрипты (ваш файл скрипта должен иметь вид- имя.auto.rsc). После того, как файл будет загружен с помощью FTP на маршрутизатор, он будет автоматически выполнен, как и с командой '/import' (этот метод работает только с FTP).
Как только файл загружен, он автоматически выполняется. Информация об успешности выполнения команд записывается в имя.auto.log
AWK — C-подобный скриптовый язык построчного разбора и обработки входного потока (например, текстового файла) по заданным шаблонам (регулярным выражениям). Может использоваться в сценариях командной строки.
Expect — инструмент для автоматизации и тестирования в ОС Unix, написанный Don Libes как расширение к скрипт-языку Tcl, для интерактивных приложений таких, как telnet, ftp, passwd, fsck, rlogin, tip, ssh, и других.
Начнем с того, что я сделал 3 файла:
- Файл List.txt в него записал имя OVPN соединений (в моем случает название магазина) и пароль от ключа (разделял табуляцией);
- sh1.sh — Баш файл с командой построчного разбора по list.txt + конвейер;
- sh2.sh — Баш файл который с помощью Echo и переменных создает файл конфига и записывает в него наши настройки.
И так:
vi list.txt
gamazin1 pass1
gamazin2 pass2
gamazin3 pass3
vi sh1.sh
#!/bin/bash
awk '{print "./sh2.sh "$1 " "$2}' ./list.txt | /bin/bash
sudo chmod +x sh1.sh
vi sh2.sh
#!/bin/bash
echo /certificate > rsc/$1.auto.rsc
echo import file-name=$1.crt passphrase=$2 >> rsc/$1.auto.rsc
echo import file-name=$1.key passphrase=$2 >> rsc/$1.auto.rsc
echo import file-name=ca.crt passphrase=$2 >> rsc/$1.auto.rsc
echo /interface ovpn-client >> rsc/$1.auto.rsc
echo add certificate=$1.crt_0 connect-to=10.10.10.10 name=$1_ovpn port=1111 user=$1 profile=default auth=sha1 cipher=blowfish128 >> rsc/$1.auto.rsc
#Каждую строчку отдельно пишем начиная с ehco.
sudo ./sh1.sh
Один нюанс!
$1.crt и $1.key их создали заранее по тому же list.txt, из — за этого имя файла так же название магазина.
Создали сотню конфигов. Теперь надо их разослать, используя все тот же AWK и Expect+FTP.
Создаем 4 файла:
- Файл list2.txt — в нем мы храним данные Mikrotik IP| Логин | Пароль | Название магазина. Разделял табуляцией.
- newsh1.sh — Баш файл с командой построчного разбора по list2.txt + конвейер
- newsh2.sh — Отправляет наши пожелания по FTP используя Expect пакет, который отвечает на запросы консоли.
- $1.auto.rsc — файл конфиг в моем случае они были созданы от переменной $1, которая являлась названием магазина в предыдущем скрипте. Пример gamazin1.auto.rsc.
vi list2.txt
192.168.1.1 admin password1 gamazin1
192.168.2.1 admin password2 gamazin2
192.168.3.1 admin password3 gamazin3
#Может быть 1 файл list.txt со всей инфой для наглядности их несколько
vi newsh1.sh
#!/bin/bash
awk '{print "./newsh2.sh "$1 " "$2 " "$3 " "$4}' ./list2.txt | /bin/bash
sudo chmod +x newsh1.sh
Sudo apt-get install expect
vi newsh2.sh
#!/bin/bash
Mikrotik=$(expect -c "
set timeout 3
spawn ftp $1
expect \"Name*\"
send \"$2\n\"
expect \"?assword:\"
send \"$3\n\"
expect \"ftp>\"
send \"put $4.crt\n\"
expect \"ftp>\"
send \"put $4.key\n\"
expect \"ftp>\"
send \"put ca.crt\n\"
expect \"ftp>\"
send \"put $4.auto.rsc\n\"
expect \"ftp>\"
send \"bye\n\"
")
sudo ./newsh1.sh
Примечание
Сначала мы отправили сертификаты с ключом, а потом только конфиг (если делать в обратной последовательности он начнет ругаться что нет таких сертификатов).
Конфиги и сертификаты разлетелись как горячие пирожки. Из — за названия .auto.rsc по FTP Mikrotik их автоматически прогнал в себе и применились наши настройки.
Мы хотим знать, что везде все супер используя конфигурацию выше меняем 1 строку.
send \"get $4.auto.log\n\"
#Обратите внимание .log стал а не .rsc
Загрузили все файлики домой и прошлись по файлам сортировкой, где 0 байт размер файла у вас проблемы c Mikrotik. По имени файла можно узнать его IP по нашему файлику list2.txt. А в хорошем варианте открыв файл можно увидеть там «Script file loaded and executed successfully».
Можно написать еще по этим файлам скрипты, но мне хватило сортировать файлы по весу.
Так же я еще один написал скрипт и после всех этих действий который закрывает FTP и наоборот открывает по SSH. Просто изменил FTP на SSH для того, чтобы…
/ip service set ftp disabled=yes
#Это по SSH просто команду отправил
#Затер файл с паролями от ключей
/file remove $4.auto.rsc
Я пытался все сразу в 1 конфиг запихать, но file remove в конце команда не давала результата он не мог затереть файл, из которого получал эту команду. Были еще нюансы.
И в итоге… счастье! Можно управлять отдельными списками Mikrotik или всеми сразу, как душе угодно. Теперь, открывая FTP и закрывая можно отправлять команды и быть уверенным что они выполнились. Но мое мнение удобнее FTP, SSH не отвалился на пол пути так как вы будете уверены, что все прошло успешно, посмотрев в папке логи.
В данной статье я показал инструменты, а как использовать их можете придумать сами…
Все делал на Ubuntu 16.04.
Про auto.rsc в Mikrotik
AWK
Expect