Mikrotik и Linux. Рутина и автоматизация

от автора

Представлюсь, меня зовут Андрей.

Первоначальная задача стояла такая — создать сотни конфигов для Mikrotik, чтобы поднять на каждом ovpn с сертификатом, затем залить на сотни Mikrotik конфиги, а так же сертификаты и ключ.

Пароль от сертификата у каждого уникален. Создавать сотни конфигов руками бред, да и в друг завтра скажут сделать новые или захочется залить еще какие-то изменения на Mikrotik.

Чего я хотел добиться:

  1. создавать автоматически уйму скриптов;
  2. автоматически отправить их на нужное мне оборудования;
  3. быть уверенным в том, что они отработали без ошибок или узнать о том, что конфиг выполнился не корректно.

image

Используя 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 файла:

  1. Файл List.txt в него записал имя OVPN соединений (в моем случает название магазина) и пароль от ключа (разделял табуляцией);
  2. sh1.sh – Баш файл с командой построчного разбора по list.txt + конвейер;
  3. 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 файла:

  1. Файл list2.txt – в нем мы храним данные Mikrotik IP| Логин | Пароль | Название магазина. Разделял табуляцией.
  2. newsh1.sh – Баш файл с командой построчного разбора по list2.txt + конвейер
  3. newsh2.sh – Отправляет наши пожелания по FTP используя Expect пакет, который отвечает на запросы консоли.
  4. $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 строку.

put на get

 send \"get $4.auto.log\n\" #Обратите внимание .log стал а не .rsc  

Загрузили все файлики домой и прошлись по файлам сортировкой, где 0 байт размер файла у вас проблемы c Mikrotik. По имени файла можно узнать его IP по нашему файлику list2.txt. А в хорошем варианте открыв файл можно увидеть там “Script file loaded and executed successfully”.

Можно написать еще по этим файлам скрипты, но мне хватило сортировать файлы по весу.

Так же я еще один написал скрипт и после всех этих действий который закрывает FTP и наоборот открывает по SSH. Просто изменил FTP на SSH для того, чтобы…

Играемся с FTP

/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


ссылка на оригинал статьи https://habr.com/ru/post/480404/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *