моя схема взаимодействия Ansible с Mikrotik(ами)

Задача: Создадим роль посредством которой отключив все ненужные сервисы на Mikrotik.

моя схема взаимодействия Ansible с Mikrotik(ами)

моя схема взаимодействия Ansible с Mikrotik(ами)

У меня большой парк устройств Mikrotik и сегодня моя цель: приобщить/проработать каким образом можно через Ubuntu 22.04 + Ansible произвести настройку отключения всех ненужных сервисов (а именно: api,api-ssl,ftp,telnet,www,www-ssl) не заходя на каждый через утилиту winbox. Просто часть оборудования была уже в строю, а та часть, которую устанавливал я, так уже настроена по одному шаблону. Поэтому нужно разобраться в этом вопросе и уже на его основе дорабатывать последующие хотелки, к примеру, получать информацию по температуре, состоянию, получить список всех доступных устройств и т.д. И учиться, ставя себе задачи.

На Mikrotik можно выполнять команды в raw режиме — просто исполнять команды на удаленном оборудовании, но не удобно, когда команд много, но можно использовать обычный SSH клиент и конвейер (pipe) для перенаправления команд\скриптов из текстового файла в SSH.

Каждая роль описывает только один аспект конфигурации и не зависит от других ролей

Playbook — это файл, который описывает каким хостам (из файла hosts) какие роли применять. В нем могут быть указаны дополнительные опции и переменные. Именно его выполняет Ansible.

  • Роль в Ansible представляем из себя подкаталог внутри каталога ansible/roles
  • Название каталог и есть название роли
  • Внутри каждой роли должна быть определенная структура подкаталогов

Каталог tasks — содержит файлы, которые исполняет ansible. В них описывается то, что нужно сделать (main.yml обязателен)

Каталог files — содержит в себе дополнительные файлы. В моем случае там будут скрипты ".rsc", которые Ansible будет запускать на RouterOS.

Шаг №1: В наличии Mikrotik RBD52G-5HacD2HnD Revision r3 (Versioin: 7.11.2)

Шаг №2: Создаю на Mikrotik учетную запись под которой будут взаимодействовать с Ansible сервера с данным Mikrotik(ом):

Winbox - IP&DNS:8291 - user&pass - System - Users — вкладка Users и нажимаю Add

  • Name: ansible
  • Group: full
  • Allowed Address: ничего не указываем или можно IP адрес сервера Ansible указать
  • Password: Aa1234567aA
  • Confirm Password: Aa1234567aA

и нажимаю Apply, OK

Шаг №3: Активируем сервис SSH на Mikrotik(е):

Winbox - IP&DNS:8291 - user&pass - IP - SSH

Активирую сервис SSH на Mikrotik

Winbox - IP&DNS:8291 - user&pass - IP - Services

  • Name: ssh
  • Port: 22
  • VRF: mail

и если сервис в статусе Disable переводим в Enable, затем нажимаем Apply, OK.

Шаг №4: На системе Ubuntu 22.04 Server где установлено приложение Ansible генерируем приватный и публичный ключ:

ekzorchik@srv-ansible:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ekzorchik/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ekzorchik/.ssh/id_rsa
Your public key has been saved in /home/ekzorchik/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:eIz9iEbTVLZK40W5hIvvUmKoydGMWfhUZI7gF5URB9s ekzorchik@srv-ansible
The key's randomart image is:
+---[RSA 3072]----+
|  . .oB=..+.     |
| . . =o+.+o.     |
|  ..o.o.Eoo.     |
|  ..o .X.+.      |
|   O .=.S        |
|  + =.o+oo       |
| . + .o+. .      |
|  +  .. .        |
|       .         |
+----[SHA256]-----+
ekzorchik@srv-ansible:~$

Шаг №5: Копируем публичный ключ сервера на Mikrotik для учетной записи ansible:

ekzorchik@srv-ansible:~$ scp /home/ekzorchik/.ssh/id_rsa.pub ansible@192.168.10.11:/
The authenticity of host '192.168.10.11 (192.168.10.11)' can't be established.
RSA key fingerprint is SHA256:asquwBAFbAhoQ5gvsvWWPY1YLFXFUIdlczjlVA9ZATc.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.10.11' (RSA) to the list of known hosts.
ansible@192.168.10.11's password:
id_rsa.pub                                                                                                                            100%  575   404.2KB/s   00:00
ekzorchik@srv-ansible:~$
[admin@MikroTik] > user ssh-keys/import public-key-file=id_rsa.pub user=ansible

Шаг №6: Проверяем что с системы Ubuntu 22.04 Server + Ansible можем подключиться по SSH через ключ:

ekzorchik@srv-ansible:~$ ssh -l ansible 192.168.10.11 "system routerboard print"
       routerboard: yes
        board-name: hAP ac^2
             model: RBD52G-5HacD2HnD
          revision: r3
     serial-number: HD908C23DGD
     firmware-type: ipq4000L
  factory-firmware: 6.48.6
  current-firmware: 7.11.2
  upgrade-firmware: 7.11.2
ekzorchik@srv-ansible:~$

Подключение через ключ проходит успешно.

Шаг №7: Создаю внутри каталога /etc/ansible каталог mikrotik в котором у меня будет все ответственное для взаимодействия с устройствами Mikrotik через Ansible:

ekzorchik@srv-ansible:~$ sudo mkdir -p /etc/ansible/mikrotik/

Шаг №8: Прописываем в hosts подключение к Mikrotik через Ansible:

ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/mikrotik/hosts
[office]
192.168.10.11

После нажимаем Ctrl + O, Enter - Ctrl + X (для выхода из редактора)

Шаг №9: Создаю переменные окружения подключения к Mikrotik:

ekzorchik@srv-ansible:~$ sudo mkdir -p /etc/ansible/mikrotik/group_vars
ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/mikrotik/group_vars/routeros.yml
file: group_vars/routeros.yml
ansible_network_os: routeros
ansible_ssh_common_args: '-o StrictHostKeyChecking no'
ansible_ssh_port: 22
ansible_ssh_user: ansible
ansible_ssh_private_key_file: /home/ekzorchik/.ssh/id_rsa

После нажимаем Ctrl + O, Enter - Ctrl + X (для выхода из редактора)

Шаг №10: Создаю структуру каталогов роли: файлы и исполняемые файлы скриптов для Mikrotik:

ekzorchik@srv-ansible:~$ sudo mkdir -p /etc/ansible/mikrotik/roles
ekzorchik@srv-ansible:~$ sudo mkdir -p /etc/ansible/mikrotik/roles/services/files
ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/mikrotik/roles/services/files/services.rsc
:if ([/ip service get api disabled] !=true) do={/ip service set api disabled=yes}
:if ([/ip service get api-ssl disabled] !=true) do={/ip service set api-ssl disabled=yes}
:if ([/ip service get ftp disabled] !=true) do={/ip service set ftp disabled=yes}
:if ([/ip service get telnet disabled] !=true) do={/ip service set telnet disabled=yes}
:if ([/ip service get www disabled] !=true) do={/ip service set www disabled=yes}
:if ([/ip service get www-ssl disabled] !=true) do={/ip service set www-ssl disabled=yes}

После нажимаем Ctrl + O, Enter - Ctrl + X (для выхода из редактора)

Проверяю что действительно в файле services.rsc есть в конце пустая строка:

grep "^$" services.rsc > /dev/null && echo

На заметку: В файле ".rsc" обязательно должна быть пустая строка в конце!

Шаг №11: Создаю структуру каталогов роли: файлы и где располагается скрипт, который нужно передать на Mikrotik:

ekzorchik@srv-ansible:~$ sudo mkdir -p /etc/ansible/mikrotik/roles/services/tasks
ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/mikrotik/roles/services/tasks/main.yml
---
 - name: Configure services
   command: bash -c "cat /etc/ansible/mikrotik/roles/services/files/services.rsc | ssh -T {{ansible_ssh_user}}@{{inventory_hostname}} -i {{ansible_ssh_private_key_file }}"

После нажимаем Ctrl + O, Enter - Ctrl + X (для выхода из редактора)

Шаг №12: Создаю Playbook задачей которого будет деактивация/выключение сервисов которые в рабочей среде не должны быть включены на Mikrotik(е):

ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/mikrotik/office.yml
---
 - hosts: office
   #Перед работой с хостом ансибл собирает с него инфу с помощью питона, естественно на микротике это работать не будет, так что эту фичу выключаем
   gather_facts: no
   connection: network_cli
   #В playbook путь к файлам переменных задается через vars_files
   #либо если в group_vars именование файла такое как раздел в hosts указывать строку ниже не нужно
   vars_files:
     - /etc/ansible/mikrotik/group_vars/routeros.yml
   roles:
     - services

После нажимаем Ctrl + O, Enter - Ctrl + X (для выхода из редактора)

Шаг №13: Так выглядит визуально структура файлов и каталогов взаимодействия через Ansible с Mikrotik(ами):

ekzorchik@srv-ansible:~$ tree /etc/ansible/mikrotik/
/etc/ansible/mikrotik/
├── group_vars
│   └── routeros.yml
├── hosts
├── office.yml
├── roles
│   └── services
│       ├── files
│       │   └── services.rsc
│       └── tasks
│           └── main.yml
└── templates

6 directories, 5 files
ekzorchik@srv-ansible:~$

Шаг №14: Тестирую Playbook, но не исполняя его на конечном устройстве:

ekzorchik@srv-ansible:~$ sudo ansible-playbook -i /etc/ansible/mikrotik/hosts /etc/ansible/mikrotik/office.yml -Cv
Using /etc/ansible/ansible.cfg as config file

PLAY [office] **********************************************************************************************************************************************************

TASK [services : Configure services] ***********************************************************************************************************************************
skipping: [192.168.10.11] => {"changed": false, "cmd": ["bash", "-c", "cat /etc/ansible/mikrotik/roles/services/files/services.rsc | ssh -T ansible@192.168.10.11 -i /home/ekzorchik/.ssh/id_rsa"], "delta": null, "end": null, "msg": "Command would have run if not in check mode", "rc": 0, "start": null, "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}

PLAY RECAP *************************************************************************************************************************************************************
192.168.10.11              : ok=0    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

ekzorchik@srv-ansible:~$

Шаг №15: После того как после теста Playbook были исключены ошибки в виде WARNING(ов), запускаем Playbook на исполнение:

ekzorchik@srv-ansible:~$ sudo ansible-playbook -i /etc/ansible/mikrotik/hosts /etc/ansible/mikrotik/office.yml

PLAY [office] **********************************************************************************************************************************************************

TASK [services : Configure services] ***********************************************************************************************************************************
changed: [192.168.10.11]

PLAY RECAP *************************************************************************************************************************************************************
192.168.10.11              : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

ekzorchik@srv-ansible:~$

Шаг №16: Проверяем, подключившись к Mikrotik(у) что Playbook успешно выполнил поставленную перед ним задачу:

Winbox - IP&DNS:8291 - user&pass - IP - Services

Playbook успешно отработал на Mikrotik hAP ac^2 (arm)

Итого, созданный Playbook, а нем роль успешно выполнила поставленную задачу, а именно деактивацию не нужных в работе сервисов на Mikrotik(е).

На заметку: Всегда проводите тест перед глобальным запуском на работающем оборудовании. И желательно выделить несколько единицы оборудования для тестирования, а не сразу перенастраивать большое количество устройств Mikrotik. Если в создании Playbook(а) допущена ошибка — «ляжет» то что критично и будете потом кусать локти и, ну Вы сами знаете, что будет.

На этом моя заметка завершена, с уважением автор блога Олло Александр aka ekzorchik.