Продолжаю вхождение в тему работы систем через 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"

Сообщение что Miikrotik успешно перезагружен

отрабатывает, хоть в выводе выше я получаю ошибку что соединение потеряно.

Это первый вариант решения своей задумки.

Вариант №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 уже не сыпятся сообщения, так лучше.

Созданная задача на перезагрузку + 10 секунд и оборудование уйдет в перезагрузку

Отлично, два способа я получил, плюс копание в сторону, как решить задумку приводит к копанию в форумах, справочных данных по Ansible. Мне это интересно, а Вам?

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