Или как избавиться от страха нажать /system reboot

Обновление MikroTik — та ещё боль. То не влезешь по SSH, то забыл сделать routerboard upgrade, то устройство «уходит в себя» и не возвращается. Особенно, когда устройств не одно, а десятки. Вручную это превращается в спорт на выносливость и крепкие нервы.

Я решил, что хватит. Написал скрипт на Python, который делает всю грязную работу за меня: подключается, проверяет обновления, ставит новые пакеты, делает routerboard upgrade и даже ждёт, пока устройство снова появится в сети. Главное — всё логируется и работает аккуратно, как системный администратор в хорошем настроении.

В этой статье:

  • Подробно разберём, как устроен скрипт.

  • Поговорим про SSH, логи, таймауты и тонкости MikroTik.

  • Приведу полный технический разбор Python-кода.


? Ключевые фрагменты кода

Подключение к устройству через Netmiko

device = {    "device_type": "mikrotik_routeros",    "ip": ip,    "username": username,    "password": password
}
conn = ConnectHandler(**device)

Проверка обновлений RouterOS

check_output = conn.send_command("/system package update check-for-updates")

Установка обновлений и подтверждение

output = conn.send_command_timing("/system package update install")
if "Do you want to upgrade" in output:    conn.write_channel("y
")

RouterBOARD upgrade при необходимости

rb_info = conn.send_command("/system routerboard print")
if curr_fw != upg_fw:    conn.send_command("/system routerboard upgrade", expect_string=r"\[y/n\]")    conn.write_channel("y
")

? Полный код и инструкции доступны:


? Технический разбор кода

? Структура

  • Аргументы CLI обрабатываются через argparse.

  • Netmiko используется для SSH-подключения (с поддержкой MikroTik).

  • Цветной вывод — с помощью colorama.

  • Все логи сохраняются в файл mikrotik_update.log.

? Как работает gather_info()

  • Подключается к устройству.

  • Извлекает установленную версию /system package update print.

  • Проверяет наличие обновлений /system package update check-for-updates.

  • Если обновление есть, показывает версию, иначе пишет, что всё актуально.

  • Работает надёжно даже при медленных ответах — с повторами.

⚙️ Что делает upgrade_device()

  • Проверяет наличие новой версии RouterOS.

  • Если есть — инициирует обновление через install.

  • Подтверждает y при необходимости.

  • Ждёт возвращения устройства после ребута.

  • Затем проверяет /system routerboard print:

    • Если upgrade-firmware > current-firmware, запускает апгрейд и ребут.

  • После каждого действия — лог.

? Как обрабатываются исключения

  • Подключение и команды завернуты в try/except.

  • Все ошибки фиксируются в логах, включая таймауты и неполадки сети.

? reboot_and_wait()

  • Ждёт возврата устройства после ребута, пингует и переподключается.

  • Максимальное время ожидания — 5 минут (настраивается).

? Пример запуска

# Проверка устройств из списка
python3 mikrotik_update.py --mode gather --file ip_list.txt --user admin
# Обновление одного IP
python3 mikrotik_update.py --mode upgrade --ip 192.168.88.1 --user admin

Пароль будет запрошен при запуске — не хранится нигде в файле.

? Стандарты и стиль

  • Код PEP8-совместим.

  • Типизация (: str, : bool) добавлена для читаемости.

  • Архитектура модульная, можно дорабатывать под себя.


? Безопасность и устойчивость

  • Нет хранения паролей.

  • Все действия логируются.

  • Последовательная обработка IP-адресов (без параллельных SSH-сессий).


P.S. Скрипт прошёл боевое тестирование на более чем 20 устройствах. Ни одно из них не стало кирпичом. Значит, всё работает. А главное — повторяемо.

Комментарии (11)


  1. Lev3250
    02.07.2025 05:26

    Написал скрипт на Python

    А точно автор, а не чатгпт?


  1. RusAlex
    02.07.2025 05:26

    Для повторяемости, неплохо было бы учесть короткие флаги для скрипта, а не только длинные


  1. RoasterToaster
    02.07.2025 05:26

    Для меня болью было три режима работы кнопки ресет. Сейчас в в корп сети от микротов осталась только 88 подсесть..


  1. net_racoon
    02.07.2025 05:26

    Ни одно из них не стало кирпичом. Значит, всё работает.

    Вообще не факт. Были модели микрота, которые не поднимались после перезагрузки приходилось плясать с ними. Поэтому я бы такое автоматизировать не стал. Ну либо провел тест сначала на тех, которые в близкой доступности.

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


  1. TerAnYu
    02.07.2025 05:26

    Что за сложности, когда есть Mikrotik RouterOS automatic backup and update


  1. KLaeda
    02.07.2025 05:26

    Сколько раз обновлял микротики и ничего не сыпалось. 4 в одном офисе, 3 в другом и 1 дома. Архитектура arm, mipsbe и smips. Но правда еесли обновлять с 6 на 7 иогут конечно слететь туннели типа site-to-site. А так, сперва проверяю на домашнем или только в одном офисе где сам нахожусь, а потом разворачиваю везде.


    1. net_racoon
      02.07.2025 05:26

      Вы просто их пачками не ставили. Мы в далеком 2013-2014 их штук 500 поставили на большой территории. Какая-то вариация 451ой модели. Потом оказалось, что при обновлении некоторые превращались в кирпич, который даже через нетинсталл не оживишь. Может модель такая, я хз. С тех пор микрот обновляю с опаской, если он не на столе у меня.


    1. theult
      02.07.2025 05:26

      Давненько уже нет проблем с обновлениями, на старых росях попадалось, что после обновления с сохранённой конфигурацией не грузится и приходлось конфиг сбрасывать. Это из тех времён, когда 951g-2hnd был топовой коробкой и была куча отдельных бескорпусных плат типа rb433


  1. Lx6g1ZG1
    02.07.2025 05:26

    А зачем для этого использовать Python?

    Вы же, согласно написанному, просто выполняете команды через Python в оболочке RouterBOARD. Это можно сделать простым bash скриптом. Если уж используете Python, тогда правильнее использовать API, который есть у RouterBOARD согласно документации


  1. necoro
    02.07.2025 05:26

    А по чему не ansible? Он же под это дело как раз и заточен..


    1. Lx6g1ZG1
      02.07.2025 05:26

      Прокомментирую по поводу Ansible: Ansible — это правильное, более высокоуровневое решение, чем API. Для MikroTik есть (были) Ansible-модули, но, вроде бы, их разработка остановилась. У сетевого оборудования вообще с автоматизацией всё не очень. Поэтому, если это Ansible, то неплохо использовать именно модули, специально для этого сделанные. Но если их нет (или они не обновляются), то получится тот же bashsible (когда используют команды оболочки), а это считается плохим решением