Продолжаю вхождение в тему работы систем через Ansible
. На этот раз задался целью, как можно взаимодействуя через Ubuntu 22.04 + Ansible
с Mikrotikом(ами)
к примеру, осуществлять перезагрузку устройства. Первое хотел выделить для этого отдельную роль, этот момент получился, но в консоль получал ошибки, что соединение разорвалось, потом проработал как сделать через Playbook
, там тоже свои нюансы. Вот поэтому данная заметка для последующего опыта покажет, как достичь задуманного обоими способами.
Последующие действия опираются на заметку: "Отключаем ненужные сервисы на Mikrotik через Ansible"
Вариант №1:
Создаю роль посредством которой оборудование Mikrotik RBD52G-5HacD2HnD (Revision r3) version 7.11.2
буду перезагружать с Ubuntu 22.04 Server + Ansible (2.15.2):
Шаг №1:
Прописываю имя хоста в файле hosts:
ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/mikrotik/hosts [office] 192.168.10.11
После нажимаем Ctrl + O, Enter - Ctrl + X
(для выхода из редактора)
Шаг №2:
Создаю каталог роли с именем, т.е. именую его, как reboot:
ekzorchik@srv-ansible:~$ sudo mkdir /etc/ansible/mikrotik/roles/reboot
Шаг №3:
Создаю внутри каталога роли каталоги: files
где будет располагаться rsc
файл и tasks
где будет располагаться строка передачи rsc
файла при подключении и исполнении на устройстве Mikrotik:
ekzorchik@srv-ansible:~$ sudo mkdir /etc/ansible/mikrotik/roles/reboot/{files,tasks} ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/mikrotik/roles/reboot/tasks/main.yml --- - name: reboot command: bash -c "cat /etc/ansible/mikrotik/roles/reboot/files/reboot.rsc | ssh -T {{ ansible_ssh_user }}@{{inventory_hostname}} -i {{ ansible_ssh_private_key_file }}"
После нажимаем Ctrl + O, Enter - Ctrl + X
(для выхода из редактора)
ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/mikrotik/roles/reboot/files/reboot.rsc /system reboot
После нажимаем Ctrl + O, Enter - Ctrl + X
(для выхода из редактора)
На заметку: В файле ".rsc"
обязательно должна быть пустая строка в конце!
Шаг №4:
Добавляю роль с именем reboot
в Playbook office.yml:
На заметку: Теги нужны в Ansible
для того, чтобы оператор мог выполнить кусок playbook
и только.
ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/mikrotik/office.yml --- - hosts: office #Перед работой с хостом ansible собирает с него инфу с помощью питона, естественно на микротике это работать не будет, так что эту фичу выключаем gather_facts: no connection: network_cli #В playbook путь к файлам переменных задается через vars_files #либо если в group_vars именование файла такое как раздел в hosts указывать строку ниже не нужно vars_files: - /etc/ansible/mikrotik/group_vars/routeros.yml roles: - role: services tags: - services - role: reboot tags: - reboot
После нажимаем Ctrl + O, Enter - Ctrl + X
(для выхода из редактора)
На заметку: На всякий случай привожу содержимое routeros.yml
ekzorchik@srv-ansible:~$ cat /etc/ansible/mikrotik/group_vars/routeros.yml file: group_vars/routeros.yml ansible_network_os: routeros ansible_connection: network_cli 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'
Шаг №5:
Проверяю (ключ "-C"
), что, запустив указанный playbook
, а в нем конкретную роль (через именование тегирования), роль отработает на устройстве:
ekzorchik@srv-ansible:~$ sudo ansible-playbook -i /etc/ansible/mikrotik/hosts /etc/ansible/mikrotik/office.yml --tags "reboot" -Cv Using /etc/ansible/ansible.cfg as config file PLAY [office] ********************************************************************************************************************************************************** TASK [reboot : reboot] ************************************************************************************************************************************************* skipping: [192.168.10.11] => {"changed": false, "cmd": ["bash", "-c", "cat /etc/ansible/mikrotik/roles/reboot/files/reboot.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:~$
Ошибок нет, как таковых, есть только сообщения.
Шаг №6:
Запускаю Playbook
с указанием тега на запуск роли перезагрузки устройства Mikrotik:
ekzorchik@srv-ansible:~$ sudo ansible-playbook -i /etc/ansible/mikrotik/hosts /etc/ansible/mikrotik/office.yml --tags "reboot" PLAY [office] ************************************************************************************************************************************************** TASK [reboot : reboot] ***************************************************************************************************************************************** fatal: [192.168.10.11]: FAILED! => {"changed": true, "cmd": ["bash", "-c", "cat /etc/ansible/mikrotik/roles/reboot/files/reboot.rsc | ssh -T ansible@192.168.10.11 -i /home/ekzorchik/.ssh/id_rsa"], "delta": "0:00:01.229686", "end": "2023-09-12 12:00:38.961972", "msg": "non-zero return code", "rc": 255, "start": "2023-09-12 12:00:37.732286", "stderr": "Received disconnect from 192.168.10.11 port 22:11: shutdown/reboot\r\nDisconnected from 192.168.10.11 port 22", "stderr_lines": ["Received disconnect from 192.168.10.11 port 22:11: shutdown/reboot", "Disconnected from 192.168.10.11 port 22"], "stdout": "", "stdout_lines": []} PLAY RECAP ***************************************************************************************************************************************************** 192.168.10.11 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0 ekzorchik@srv-ansible:~$
Данный вывод показывает, что мы передали команду "/system reboot"
и тут же потеряли доступ к оборудованию по SSH
, но команда отработала.
Смотрим после подключившись через утилиту winbox
к оборудованию Mikrotik,
переходив в меню Log
и видим строку с сообщением "router rebooted"
отрабатывает, хоть в выводе выше я получаю ошибку что соединение потеряно.
Это первый вариант решения своей задумки.
Вариант №2:
Создаю Playbook
посредством которого оборудование Mikrotik RBD52G-5HacD2HnD (Revision r3) version 7.11.2
буду перезагружать с Ubuntu 22.04 Server + Ansible (2.15.2):
Шаг №1:
Создаю каталог с именем playbook
где у меня будут располагаться playbook(и):
ekzorchik@srv-ansible:~$ sudo mkdir /etc/ansible/mikrotik/playbook
Шаг №2:
Создаю Playbook:
ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/mikrotik/playbook/reboot.yml --- - hosts: office gather_facts: false vars_files: - /etc/ansible/mikrotik/group_vars/routeros.yml tasks: - name: System reboot community.routeros.command: commands: - /system scheduler add name=reboot on-event="/system reboot" start-time=([/system clock get time] + 00:00:10)
После нажимаем Ctrl + O, Enter - Ctrl + X
(для выхода из редактора)
На заметку: На всякий случай привожу содержимое routeros.yml
ekzorchik@srv-ansible:~$ cat /etc/ansible/mikrotik/group_vars/routeros.yml file: group_vars/routeros.yml ansible_network_os: routeros ansible_connection: network_cli 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'
в этом Playbook
я создаю задачу на оборудовании по прошествии 10
секунд с момента ее создания оборудование будет перезагружено, вот только задача останется. Надо подумать, как ее потом убирать, как вариант роль чистки заданий.
Шаг №3:
Запускаю созданный Playbook:
ekzorchik@srv-ansible:~$ sudo ansible-playbook -i /etc/ansible/mikrotik/hosts /etc/ansible/mikrotik/playbook/reboot.yml PLAY [office] ************************************************************************************************************************************************** TASK [System reboot] ******************************************************************************************************************************************* 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:~$
после запуска Playbook
на Mikrotik
появляется задание в планировщике Scheduler
где спустя 10
секунд после его появления оборудование уйдет в перезагрузку и на консоль выполнения Ansible
уже не сыпятся сообщения, так лучше.
Отлично, два способа я получил, плюс копание в сторону, как решить задумку приводит к копанию в форумах, справочных данных по Ansible
. Мне это интересно, а Вам?
На этом заметка завершена, с уважением автор блога Олло Александр aka ekzorchik.