187

Ansible для Mikrotik: бэкапы по identity и псевдо-иммутабельность1

Внезапно появилось у меня 50 микротиков по филиалам. Задача – настроить бэкап в систему контроля версий и получить возможность выполнить какую-то настройку на всех микротиках, где этой настройки нет. Вторая задача стояла – научиться что-то делать в ansible. Тут ansible не содержит особых преимуществ перед обычным bash скриптом, кроме, может, скорости работы за счет параллельности выполнения.


Все мануалы, что я нашла, содержали инструкцию по бэкапу в ansible одного микротика и такие типа «экстраполируйте сами». Ну зашибись, вся проблема в том, что имя бэкапа задаётся вручную, а если микротиков много, то как-то сделанные бэкапы надо различать.


В микротике есть поле identity и логично было бы именем из identity и называть бэкап. Но вначале я не нашла как его сохранить в переменную и пошла задавать переменные вручную. Кому интересно про identity – переходите к способу 2.


Я опущу, как ставить ansible, задавать пароли и шифровать их, это как раз легко гуглится.


Способ с заданием имени бэкапа в переменной вручную.

ansible_user должен иметь доступ на микротик full, а сервер, с которого запускаете yml должен иметь доступ по ssh на микротик. При этом либо надо разок законнектиться по ssh до этого и сохранить ключи, либо отключить проверку ssh ключей в ansible.


Пикабу съедает пробелы. Ссылка на код текстом будет в конце

Но всё же меня глодала мысль, что можно использовать identity, а тут удачно работа оплатила курсы по всяким там девопс штукам и мне рассказали про register. Так что нет ничего невозможного, смотрите далее.


Способ с бэкапами микротика по identity

Тут проблема в том, что stdout_lines возвращает штуку типа [[u’name: Kostroma]] и как я ни крутила – как к массиву я к ней обратиться не могу. Так что немного через задницу (буду рада, если подскажете красивое решение) из этой строки выковыривается строка с непосредственно identity.


Теперь убираем в hosts file_name

Про то, как делать текстовый бэкап – в примере 1, скрестить ужа с ежом можете сами.

Мой скрипт по запихиванию в систему контроля версий и отсылки на почту. Вот тут я писала подробнее как настроить SVN


#!/bin/bash

now=$(date +"%d_%m_%Y")

rm /usr/scripts/log.txt

ansible-playbook --vault-password-file /etc/ansible/vault_pass_file /usr/scripts/mik-backup.yml >> /usr/scripts/log.txt

cd /usr/svn_backup_repo/DFL_BACKUPS

svn add mikrotik/* --force -q >> /usr/scripts/log.txt

svn commit -m "added backups $now" >> /usr/scripts/log.txt

/usr/bin/mail it@mydomain.ru < /usr/scripts/log.txt -s "Отчет о бэкапах Mikrotik"


Иммутабельность – это неизменность. То есть если уже, например, в файле есть такие изменения, то второй раз они не делаются. Это то, в чем фишка Ansible и то, что не реализовано для микротиков (так как например в firewall важен порядок применения – это одна из причин, почему в его конфиге не поддерживается иммутабельность).


Теперь сюжет из жизни: мне понадобилось вкатить на все микротики одинаковый фильтр сетей OSPF – оставить только серые сети и фильтрануть по маске 10.0.0.0/8. При этом на каких-то микротиках я это уже делала, но не помню на каких. Прощелкать 50 штук – ну такая себе забава.


Итого сливается бэкап в текстовом виде, идет поиск по нужной строке и если она не найдена, то выполняем команду. А если найдена – ничего не делаем. Такая вот псевдо-иммутабельность получается. Да, один скрипт – одна команда, что не очень удобно, под список команд надо дорабатывать.

Сылка на весь код текстом вот

Ну и я не претендую на гуру, только-только начала щупать Ansible, надеюсь кому-нибудь пригодится.

Лига Сисадминов

2.4K постов18.9K подписчиков

Правила сообщества

Мы здесь рады любым постам связанным с рабочими буднями специалистов нашей сферы деятельности.

Вы смотрите срез комментариев. Показать все
0
Автор поста оценил этот комментарий
Спасибо за статью и плейбук. Очень пригодились мне как делающему первые шаги в ансибле. Всё работает куль.
раскрыть ветку (12)
0
Автор поста оценил этот комментарий

О! Огонь, кому-то это помогло, очень рада))

раскрыть ветку (11)
0
Автор поста оценил этот комментарий

Вопрос назрел, сорян конечно, но гугл не помог. Только в двух местах встретил подобную проблему и то без ответа. Не сталкивалась с тем, что netcommon.net_get сливает неполные файлы по sftp? Буквально строчек десять из всего export compact. Да и .backup файлы по размеру не бьются на самом Микроте и в сохранёнке.

раскрыть ветку (10)
0
Автор поста оценил этот комментарий

Честно - не было. Были проблемы с tftp и нестабильным соединением аналогичные, ну собственно, там стабилизацией соединения решилось. Ну и вопрос - а не пишут ли файл с одним именем два процесса? А то может один записал, второй затер, первый дописал 10 строк. Анзибль же параллелит.

раскрыть ветку (9)
0
Автор поста оценил этот комментарий

Привет. Решил проблему, если интересно:

добавил 'b' в plugins/action/net_get.py

try: with open(tmp_dest_file, "rb") as f: new_content = f.read() with open(dest, "rb") as f: old_content = f.read() except (IOError, OSError): os.remove(tmp_dest_file) raise

и указал в переменных

ansible_network_cli_ssh_type: paramiko

раскрыть ветку (7)
0
Автор поста оценил этот комментарий

Спасибо, может кому пригодится

0
Автор поста оценил этот комментарий

Привет. Точно такая же проблема. Сделал как у тебя, но выдает ошибку "Faled to authenticate: Autentication faled: transport shut down or saw EOF"

Не было такого?

раскрыть ветку (4)
0
Автор поста оценил этот комментарий
Не, такого не было, даже не знаю что и подсказать
раскрыть ветку (3)
0
Автор поста оценил этот комментарий

А где решение нашел? Я вот только твое и нашел.

раскрыть ветку (2)
0
Автор поста оценил этот комментарий
Уже и не помню, копал во всех направлениях. Помню, что аглицкий сайт какой-то. Попробуй 'b' убрать. Не факт, что проблема там. Скорее всего проблема именно с модулем paramiko, т. к. микроты нормально работают только с ним.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Да и судя по ошибке ругается именно на транспорт
0
Автор поста оценил этот комментарий

причём переменную надо описывать непосредственно в плейбуке. Отдельно не работает.

0
Автор поста оценил этот комментарий
Не, в хостах одно устройство сейчас, плюс выполняется только get готового файла из Микрота 😕
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку