Задача: Создадим роль посредством которой отключив все ненужные сервисы на 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
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(е).
На заметку: Всегда проводите тест перед глобальным запуском на работающем оборудовании. И желательно выделить несколько единицы оборудования для тестирования, а не сразу перенастраивать большое количество устройств Mikrotik
. Если в создании Playbook(а)
допущена ошибка — «ляжет» то что критично и будете потом кусать локти и, ну Вы сами знаете, что будет.
На этом моя заметка завершена, с уважением автор блога Олло Александр aka ekzorchik.