Или как избавиться от страха нажать
/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)
RusAlex
02.07.2025 05:26Для повторяемости, неплохо было бы учесть короткие флаги для скрипта, а не только длинные
RoasterToaster
02.07.2025 05:26Для меня болью было три режима работы кнопки ресет. Сейчас в в корп сети от микротов осталась только 88 подсесть..
net_racoon
02.07.2025 05:26Ни одно из них не стало кирпичом. Значит, всё работает.
Вообще не факт. Были модели микрота, которые не поднимались после перезагрузки приходилось плясать с ними. Поэтому я бы такое автоматизировать не стал. Ну либо провел тест сначала на тех, которые в близкой доступности.
А вы для каждой задачи будете скрипт-лесопед писать, почему Ансибл не использовать?
KLaeda
02.07.2025 05:26Сколько раз обновлял микротики и ничего не сыпалось. 4 в одном офисе, 3 в другом и 1 дома. Архитектура arm, mipsbe и smips. Но правда еесли обновлять с 6 на 7 иогут конечно слететь туннели типа site-to-site. А так, сперва проверяю на домашнем или только в одном офисе где сам нахожусь, а потом разворачиваю везде.
net_racoon
02.07.2025 05:26Вы просто их пачками не ставили. Мы в далеком 2013-2014 их штук 500 поставили на большой территории. Какая-то вариация 451ой модели. Потом оказалось, что при обновлении некоторые превращались в кирпич, который даже через нетинсталл не оживишь. Может модель такая, я хз. С тех пор микрот обновляю с опаской, если он не на столе у меня.
theult
02.07.2025 05:26Давненько уже нет проблем с обновлениями, на старых росях попадалось, что после обновления с сохранённой конфигурацией не грузится и приходлось конфиг сбрасывать. Это из тех времён, когда 951g-2hnd был топовой коробкой и была куча отдельных бескорпусных плат типа rb433
Lx6g1ZG1
02.07.2025 05:26А зачем для этого использовать Python?
Вы же, согласно написанному, просто выполняете команды через Python в оболочке RouterBOARD. Это можно сделать простым bash скриптом. Если уж используете Python, тогда правильнее использовать API, который есть у RouterBOARD согласно документации
necoro
02.07.2025 05:26А по чему не ansible? Он же под это дело как раз и заточен..
Lx6g1ZG1
02.07.2025 05:26Прокомментирую по поводу Ansible: Ansible — это правильное, более высокоуровневое решение, чем API. Для MikroTik есть (были) Ansible-модули, но, вроде бы, их разработка остановилась. У сетевого оборудования вообще с автоматизацией всё не очень. Поэтому, если это Ansible, то неплохо использовать именно модули, специально для этого сделанные. Но если их нет (или они не обновляются), то получится тот же bashsible (когда используют команды оболочки), а это считается плохим решением
Lev3250
А точно автор, а не чатгпт?