Внезапно появилось у меня 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, надеюсь кому-нибудь пригодится.