ansible и mikrotik

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
Ответить
ansible и mikrotik
У кого был опыт настройки с Ansible, можете поделиться опытом и что почитать.
У меня более 150 mikrotik и требуется делать групповые задачи:
- бэкапы
- обновления конфигурации

Буду признаетелен если кто то расскажет свой опыт настройки Ansible и mikrotik.
Для начала хорошо бы разобрать, как работает Ansible, без связки с mikrotik, хорошее видео:


И ссылка на документацию по Ansible:  https://docs.ansible.com/ansible/latest/index.html
Услуги Системного Администратора - Работаю только с Юр. Лицами по договору обслуживания.
Теперь рассмотрим два варианта управления mikrotik через ansible, первый вариант наиболее простой когда мы передаем микротик команду вида:
command: bash -c "cat roles/TT-set-dns-servers/files/dns-servers.rsc | ssh -T {{inventory_hostname}} -p {{ansible_ssh_port}}"  
И фактически вся логика зашита в .rsc (в скрипте микротик) а ансибле это только средства доставки в нем никакой логике не лежит, что просто для системных администраторов, т.к вы не подвязаны на ansible и можете те же rsc выполнить и руками с тем же результатом, вот два виде c такой связкой mikrotik и Ansible

ссылка на GIT с скриптами в видео:
https://github.com/0x566164696D/mikroansible (все просто и понятно)
И еще одно видео на послушать, про тоже самое, но уже без выложиных скриптов:
Услуги Системного Администратора - Работаю только с Юр. Лицами по договору обслуживания.
Второй вариант скорее для devops, где вся логика зашита в task самого ansible, пример:
Код
    - name: Get Upgrade Firmware Line
      set_fact:
        upgrade: "{{ item | replace('upgrade-firmware: ', '') | trim }}"
      when: "'upgrade-firmware:' in item"
      loop: "{{ output.stdout_lines[0] }}"

    - name: Get Current Firmware Line
      set_fact:
        current: "{{ item | replace('current-firmware: ', '') | trim }}"
      when: "'current-firmware:' in item"
      loop: "{{ output.stdout_lines[0] }}"


Такая возможность начиная с версии: New in version 2.7.
ссылка на документацияю: https://docs.ansible.com/ansible/2.9/modules/routeros_command_module.html
Ansible Mikrotik Mass Configuration Fast - Mikrotik MUM US 2020

ссылка на скрипты о которых идет речь: https://github.com/gregsowell/ansible-mikrotik
Услуги Системного Администратора - Работаю только с Юр. Лицами по договору обслуживания.
Скачать: https://pastebin.com/dl/nN89nDJp
Код
#код варианта 1
[Mikrotiks]
1.2.3.4 file_name=Kostroma
2.3.4.5 file_name=Adygeya
3.4.5.6 file_name=Amur
[Mikrotiks:vars]
ansible_ssh_user=ansible_user
ansible_network_os=routeros
 
#файл .yml
- hosts: Mikrotiks
  vars_files:
    - /etc/ansible/vars/mik_pass_vault.yml
  connection: network_cli
  gather_facts: false
  tasks:
    - name: backup-file create
      routeros_command:
        commands: /system backup save name={{ file_name }}
    - name: backup-resource create
      routeros_command:
        commands: export file={{ file_name }}.rsc
    - name: backup-file download
      ansible.netcommon.net_get:
        src: "{{ file_name }}.backup"
        dest: /usr/svn_backup_repo/DFL_BACKUPS/mikrotik/{{ file_name }}.backup
        protocol: sftp
    - name: backup-resource download
      ansible.netcommon.net_get:
        src: "{{ file_name }}.rsc"
        dest: /usr/svn_backup_repo/DFL_BACKUPS/mikrotik/{{ file_name }}.rsc
        protocol: sftp
#код варианта 2
[Mikrotiks]
1.2.3.4 
2.3.4.5 
3.4.5.6 
[Mikrotiks:vars]
ansible_ssh_user=ansible_user
ansible_network_os=routeros
 
#файл .yml
- hosts: Mikrotiks
  vars_files:
    - /etc/ansible/vars/mik_pass_vault.yml
  connection: network_cli
  gather_facts: false
  tasks:
    - name: do backup
      routeros_command:
        commands: /system backup save name=[/system identity get name]
    - name: get name of mik
      routeros_command:
        commands: /system identity print
      register: mik_identity
    - name: get identity from string
      shell: echo {{ mik_identity.stdout_lines }} | cut -d':' -f 2 | cut -c2- |  rev | cut -c3- | rev
      register: identity
     - name: get backup
      ansible.netcommon.net_get:
        src: "{{ identity.stdout_lines[0] }}.backup"
        dest: /usr/svn_backup_repo/DFL_BACKUPS/mikrotik/{{ identity.stdout_lines[0] }}.backup
        protocol: sftp
#Код для сохранения в системе контроля версий
#!/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"
 
#Код для псевдо-иммутабельности
- hosts: Mikrotiks
  vars_files:
    - /etc/ansible/vars/mik_pass_vault.yml
  connection: network_cli
  gather_facts: false
  tasks:
    - name: do backup
      routeros_command:
        commands: export file=[/system identity get name]
    - name: get name of mik
      routeros_command:
        commands: /system identity print
      register: mik_identity
    - name: get identity from string
      shell: echo {{ mik_identity.stdout_lines }} | cut -d':' -f 2 | cut -c2- |  rev | cut -c3- | rev
      register: identity
    - name: get backup
      ansible.netcommon.net_get:
        src: "{{ identity.stdout_lines[0] }}.rsc"
        dest: /tmp/{{ identity.stdout_lines[0] }}.rsc
        protocol: sftp
    - set_fact: command_line="add action=accept chain=ospf-out prefix=10.0.0.0/8 prefix-length=0-32"
    - name: find str
      shell: cat /tmp/{{ identity.stdout_lines[0] }}.rsc | grep -c "{{ command_line }}"
      register: outtext
      ignore_errors: true
    - name: ospf filer
      routeros_command:
        commands:
          - /routing filter {{ command_line }}
      when: outtext.stdout_lines[0] == "0"
 


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

1. Кусок кода, конроля версий:
#!/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"

2.  shell: echo {{ mik_identity.stdout_lines }} | cut -d':' -f 2 | cut -c2- |  rev | cut -c3- | rev
выдергиваем identity

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



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


Итого сливается бэкап в текстовом виде, идет поиск по нужной строке и если она не найдена, то выполняем команду. А если найдена – ничего не делаем. Такая вот псевдо-иммутабельность получается. Да, один скрипт – одна команда, что не очень удобно, под список команд надо дорабатывать.
Услуги Системного Администратора - Работаю только с Юр. Лицами по договору обслуживания.
Страницы: 1
Ответить
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)
Форма ответов
Текст сообщения*
:) ;) :D 8-) :( :| :cry: :evil: :o :oops: :{} :?: :!: :idea:
Защита от автоматических сообщений. Введите символы, изображенные на этой картинке в поле ввода &quote;Код подтверждения&quote;.