[Из песочницы] 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

© Habrahabr.ru