LINUX.ORG.RU

Нужно чтобы роутер восстановился из бекапа?

Обычно это делается отложенной перезагрузкой роутера

Задается время перезапуска (через 5 минут, например)

Накатываются изменения без сохранения

Если связь не прервалась - сохраняемся и отменяем перезагрузку

Если прервалась - роутер перезагрузится со старой конфигурацией

Сам способ отложенной перезагрузки зависит от роутера

CaHbl4
()
Ответ на: комментарий от CaHbl4

Задача

Вообще нужно так: 1)делаем бэкап (это есть) 2)накатываем измениения (есть) 3) Если связь с роутером потеряли, восстанавливаемся из бэкапа, если нет , то не нужно востанавливаться.

Я пока не придумал как это сделать.

Как лучше ansible сказать, что свзяь прервалась (он сам пинг запустет) или ansible спросит меня в конце всё ок, если я скажу не ок, он восстановит из бэкапа.

beren
() автор топика
Ответ на: Задача от beren

3) Если связь с роутером потеряли, восстанавливаемся из бэкапа

я один здесь вижу проблему? Связь потеряли, как соединится чтобы бэкап накатить, Карл?

Как написали выше, нужно смотреть возможности конкретного роутера откатываться с running-config на startup-config при неудачных изменениях или по таймеру

MadMax
()
Ответ на: комментарий от MadMax

Задача

Поэтому я спрашиваю возможно ли так.

Может быть ansible сначала должен загрузить скрипт,который будет применять изменения а внутри скрмпта уже будет логика восстановления из бэкапа при разрыве соединения ?

Но тут сразу возникает несколько вопросов, например, обычно мы хотим изменить mikrotik что-то одно (добавить правила в firewall, сменить пароль пользователя и тд), . Сейчас в playbook делаю так

- name: Do IT
  command: bash -c "cat roles/DO ITl/files/DOIT.rsc | ssh -T {{inventory_hostname}} -p 22"

А в doit.rsc уже команнды, чсто нужно сделать на mikrotik Как сделать так чтобы, загрузился скрпит кторый сделает бэкап, потом применить необходымие настройки и откатит елс связь пропала ?

beren
() автор топика

если пропала связь роутером, восстановился из бэкапа

Ansible на роутере что-ли стоит? Иначе как он к нему достучится чтоб восстановить?

Вообще идея Ansible в том, что он приводит среду к описанному состоянию. Так что создаешь состояние «бэкапа» (собираешь конфиги и вот это все), и если сценарий с новым состоянием не отрабатывает - запускаешь плейбук, который раскатает старое.

micronekodesu ★★★
()
Ответ на: Задача от beren

Сейчас в playbook делаю так

Эта таска запустится на удаленном хосте (на микротике в этом случае), зачем вот эта наркомания с ssh? Тем более чтоб так сработало надо roles/DO ITl/files/DOIT.rsc туда предварительно доставить.

А в doit.rsc уже команнды, чсто нужно сделать на mikrotik

Не правильно. Если берете оркестратор, используйте его. Если у вас все внутри каких-то там скриптов - соберите в один да залейте через ssh, ansible не нужен в таком случае.

загрузился скрпит кторый сделает бэкап, потом применить необходымие настройки и откатит елс связь пропала

Еще раз спрошу про то, как вы себе это представляете - команду отката надо запустить на микротике, проверить связь нужно с внешней тачки. Как в случае отвала связи можно запустить скрипт на микротике? Без связи!!

Надо делать как тут уже советовали - не делать перманентные изменения (чтоб ребутом роутера откатить) или восстанавливаться по таймеру - если связь не отвалилась тупо убиваем процесс восстановления, который в это время отсчитывает время до того как начнет действовать.

micronekodesu ★★★
()
Последнее исправление: micronekodesu (всего исправлений: 1)
Ответ на: комментарий от CaHbl4

Задача

А как можно с помощью ansible можно накатить изменения без сохранения и если связь не прервалась, то сохраняемся и отменяем перезагрузку ? Нашёл такой скрипт, который перезагружает mikrotik при потери связи перезагрузит mikrotik

:local PingCount 3
:local google 8.8.8.8
:local yandex 77.88.8.8
:local mail 94.100.180.201
:local ResultGoogle [/ping count=$PingCount $Google interface=yota]
:local Resultyandex [/ping count=$PingCount $yandex interface=yota]
:local ResultMail [/ping count=$PingCount $mail interface=yota]
:local MainIfInetOk false;
:set MainIfInetOk (($ResultGoogle + $Resultyandex + $ResultMail) >= (2 * $PingCount))
:put "MainIfInetOk=$MainIfInetOk"
if (!$MainIfInetOk) do={
/log error "Bad connect"
/system reboot
}
if ($MainIfInetOk) do={
/log info "Connect OK"
}

Его можно адаптировать к моей задаче ?

beren
() автор топика
Ответ на: комментарий от micronekodesu

Модуль

Пробую сделать по https://docs.ansible.com/ansible/2.7/network/user_guide/platform_routeros.html

В /etc/ansible/group_vars/all.yml

ansible_connection: local
ansible_network_os: routeros
ansible_user: mlns-ans
ansible_become: yes
ansible_become_method: enable

В playbook

---
- hosts: all

  tasks:
   - name: run command on remote devices
     routeros_command:
       commands: /system routerboard print

Ошибки:

An exception occurred during task execution. To see the full traceback, use -vvv. The error was: AssertionError: socket_path must be a value
fatal: [xx.xx.xx.xx]: FAILED! => {"changed": false, "module_stderr": "Traceback (most recent call last):\n  File \"/home/mlns-ans/.ansible/tmp/ansible-tmp-1542011868.04-13211809413393/AnsiballZ_routeros_command.py\", line 113, in <module>\n    _ansiballz_main()\n  File \"/home/mlns-ans/.ansible/tmp/ansible-tmp-1542011868.04-13211809413393/AnsiballZ_routeros_command.py\", line 105, in _ansiballz_main\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n  File \"/home/mlns-ans/.ansible/tmp/ansible-tmp-1542011868.04-13211809413393/AnsiballZ_routeros_command.py\", line 48, in invoke_module\n    imp.load_module('__main__', mod, module, MOD_DESC)\n  File \"/tmp/ansible_routeros_command_payload_ntGas9/__main__.py\", line 205, in <module>\n  File \"/tmp/ansible_routeros_command_payload_ntGas9/__main__.py\", line 175, in main\n  File \"/tmp/ansible_routeros_command_payload_ntGas9/ansible_routeros_command_payload.zip/ansible/module_utils/network/routeros/routeros.py\", line 125, in run_commands\n  File \"/tmp/ansible_routeros_command_payload_ntGas9/ansible_routeros_command_payload.zip/ansible/module_utils/network/routeros/routeros.py\", line 55, in get_connection\n  File \"/tmp/ansible_routeros_command_payload_ntGas9/ansible_routeros_command_payload.zip/ansible/module_utils/network/routeros/routeros.py\", line 69, in get_capabilities\n  File \"/tmp/ansible_routeros_command_payload_ntGas9/ansible_routeros_command_payload.zip/ansible/module_utils/connection.py\", line 123, in __init__\nAssertionError: socket_path must be a value\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}

В чём может быть проблема ?

beren
() автор топика
Ответ на: Модуль от beren

Так он вам пишет «socket_path must be a value», ошибка в работе (или вызове) модуля.

Вообще для локального запуска вы можете просто модуль command использовать.

micronekodesu ★★★
()
Ответ на: комментарий от MadMax

У mikrotik нет отдельной startup конфигурации. Есть safe mode, но работает это только из winbox.

Deleted
()

Ansible не откатит конфиг, если потеряет связь. Но в микротике есть поддержка скриптов https://wiki.mikrotik.com/wiki/Manual:Scripting. Думаю подойдёт вариант:

  • Ansible подключается и делает бэкап конфига средствами микротика (https://wiki.mikrotik.com/wiki/Manual:Configuration_Management)
  • Ansible создаёт скрипт и включает его в cron, чтобы микротик сам при определённых условиях в скрипте откатился из бэкапа
  • Если всё хорошо, то ansible отключает/удаляет скрипт
  • Если всё плохоб то сам микротик откатит конфиг
Deleted
()
Последнее исправление: WiZ_Ed (всего исправлений: 1)
Ответ на: комментарий от micronekodesu

Command

В playbook

---
- hosts: all

  tasks:
   - name: run command on remote devices
     command: "/system routerboard print"

То такая ошибка

 FAILED! => {"changed": false, "cmd": "/system routerboard print", "msg": "[Errno 2] No such file or directory", "rc": 2}
beren
() автор топика
Ответ на: комментарий от micronekodesu

Ошибка

Нет.

Получатеся, комманды в routeros передаются как-то иначе.

Но как -это большой вопрос )

beren
() автор топика
Ответ на: Ошибка от beren

Ну судя по всему это команда какого-то отдельного shell'а, а модуль command запускает команду «просто так». Так что похоже я был не прав и модуль "routeros_command" вам нужен. Ну или "shell". Увы, с routeros я не знаком.

micronekodesu ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.