Netmiko: упрощение сетевой автоматизации на Python

от автора

Привет, Хабр!

Сегодня рассажем о модуле, который упрощает автоматизацию сетевых устройств — Netmiko. Если вы, как и мы, когда-то пытались автоматизировать конфигурации и управление сетью через SSH, то вы знаете, насколько это может быть сложным процессом. И тут на сцену помогает Netmiko.

Netmiko — это обертка над библиотекой Paramiko, разработанная для сетевых инженеров. Она упрощает работу с SSH-соединениями и добавляет ряд методов и интерфейсов для взаимодействия с сетевыми устройствами.

Этот модуль поддерживает большой спектр сетевых устройств — от Cisco и Juniper до Arista и HP. Всё, что нужно, это определить параметры устройства в виде словаря, и Netmiko позаботится обо всем остальном.

Установим:

pip install netmiko

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

Для начала задаем параметры устройства в виде словаря. Эти параметры включают тип устройства, IP-адрес, логин, пароль и, при необходимости, секретный пароль для режима enable. Пример словаря для подключения к маршрутизатору Cisco:

from netmiko import ConnectHandler  cisco_router = {     'device_type': 'cisco_ios',     'host': '192.168.1.1',     'username': 'user',     'password': 'password',     'secret': 'enable_secret',     'port': 22,  # по дефолту порт 22 }

Netmiko использует объект ConnectHandler для создания SSH-соединения с сетевыми устройствами. Этот объект автоматом выбирает нужный класс для работы с устройством на основе указанных параметров.

net_connect = ConnectHandler(**cisco_router)

После создания объекта ConnectHandler можно использовать различные методы для взаимодействия с устройством.

Многие устройства требуют переключения в привилегированный режим enable mode для выполнения конфигурационных команд. Для этого используется метод enable(), который автоматом вводит команду для перехода в режим enable и вводит необходимый пароль:

net_connect.enable()

Чтобы выйти из режима enable, используется метод exit_enable_mode():

net_connect.exit_enable_mode()

Отправка команд и конфигураций в Netmiko

Метод send_command используется для отправки одиночных команд на устройство и получения их вывода. Метод хорош для выполнения команд show и других одноразовых команд:

from netmiko import ConnectHandler  # определение параметров устройства cisco_router = {     'device_type': 'cisco_ios',     'host': '192.168.1.1',     'username': 'user',     'password': 'password',     'secret': 'enable_secret',     'port': 22, }  # создание соединения net_connect = ConnectHandler(**cisco_router)  # выполнение команды и получение результата output = net_connect.send_command('show ip int brief') print(output)  # зкрытие соединения net_connect.disconnect()

Метод send_command имеет пару параметров, которые можно использовать для настройки выполнения команды:

  • command_string: строка команды для выполнения.

  • expect_string: строка, до которой нужно ожидать вывод (если не указано, используется строка приглашения).

  • delay_factor: множитель задержки перед началом поиска строки.

  • max_loops: максимальное количество итераций перед выдачей ошибки (по умолчанию 500).

Метод send_config_set используется для отправки одной или нескольких конфигурационных команд. Он позволяет выполнять изменения конфигурации устройства:

# определение конфигурационных команд config_commands = [     'interface Loopback0',     'ip address 10.0.0.1 255.255.255.0', ]  # отправка конфигурационных команд output = net_connect.send_config_set(config_commands) print(output)

Метод send_config_set может принимать список команд или одну команду в виде строки. Он также автоматом переключается в конф. режим и выходит из него после выполнения команд.

Метод send_config_from_file позволяет загружать конфигурационные команды из файла. Так можно заранее применять подготовленные конфигурационные скрипты:

# отправка конфигурационных команд из файла output = net_connect.send_config_from_file('config.txt') print(output)

Файл config.txt должен содержать список конфигурационных команд, каждая команда на новой строке.

Кроме вышеуказанных методов, Netmiko имеет и другие хорошие методы:

  1. Метод send_command_timing:

    • Аналогичен send_command, но основан на тайминге. Хорош, когда вывод команды может изменяться со временем, и требуется больше контроля над ожиданием вывода.

      output = net_connect.send_command_timing('show version') print(output)
  2. Метод save_config:

    • Позволяет сохранить текущую конфигурацию на устройстве (мы его уже рассмотрели в примерах выше, но стоит его тут отметить):

      output = net_connect.save_config() print(output)
  3. Метод cleanup:

    • Выполняет очистку соединения и освобождение ресурсов. Хорош для завершения работы и предотвращения утечек памяти:

      net_connect.cleanup()

Примеры скриптов с Netmiko

Массовое обновление конфигураций на маршрутизаторах

В крупных честка часто необходимо обновлять конфигурации на множестве маршрутизаторов одновременно. С помощью Netmiko можно автоматизировать этот процесс:

from netmiko import ConnectHandler import logging  # включение логирования logging.basicConfig(filename='netmiko_global.log', level=logging.DEBUG) logger = logging.getLogger("netmiko")  # определение устройств devices = [     {         'device_type': 'cisco_ios',         'host': '192.168.1.1',         'username': 'admin',         'password': 'password',         'secret': 'secret',     },     {         'device_type': 'cisco_ios',         'host': '192.168.1.2',         'username': 'admin',         'password': 'password',         'secret': 'secret',     }, ]  # команды для обновления конфигурации config_commands = [     'interface GigabitEthernet0/1',     'description Uplink to Core',     'ip address 10.0.0.1 255.255.255.0', ]  # выполнение обновления конфигурации на всех устройствах for device in devices:     net_connect = ConnectHandler(**device)     net_connect.enable()     output = net_connect.send_config_set(config_commands)     print(output)     net_connect.disconnect()

Скрипт подключается к каждому маршрутизатору, переходит в режим enable, отправляет конфигурационные команды и выводит результат.

Сбор данных о состоянии интерфейсов

Срипт собирает данные о состоянии интерфейсов с нескольких коммутаторов и сохраняет их в файл для последующего анализа:

from netmiko import ConnectHandler import csv  # определение устройств devices = [     {         'device_type': 'cisco_ios',         'host': '192.168.1.10',         'username': 'admin',         'password': 'password',         'secret': 'secret',     },     {         'device_type': 'cisco_ios',         'host': '192.168.1.11',         'username': 'admin',         'password': 'password',         'secret': 'secret',     }, ]  # файл для сохранения данных output_file = 'interface_status.csv'  # открытие файла для записи with open(output_file, mode='w', newline='') as file:     writer = csv.writer(file)     writer.writerow(['Device', 'Interface', 'Status', 'Protocol'])      for device in devices:         net_connect = ConnectHandler(**device)         net_connect.enable()         output = net_connect.send_command('show ip int brief')                  for line in output.splitlines()[1:]:             if line:                 parts = line.split()                 writer.writerow([device['host'], parts[0], parts[4], parts[5]])                  net_connect.disconnect()

Скрипт подключается к каждому коммутатору, выполняет команду show ip int brief, извлекает данные о состоянии интерфейсов и записывает их в CSV файл.

Автоматическое резервное копирование конфигураций

Регулярное резервное копирование конфигураций сетевых устройств делают для обеспечения надежности сети.

Скрипт автоматизирует процесс создания резервных копий конфигураций:

from netmiko import ConnectHandler import datetime  # определение устройств devices = [     {         'device_type': 'cisco_ios',         'host': '192.168.1.1',         'username': 'admin',         'password': 'password',         'secret': 'secret',     },     {         'device_type': 'cisco_ios',         'host': '192.168.1.2',         'username': 'admin',         'password': 'password',         'secret': 'secret',     }, ]  # текущая дата для имени файла current_date = datetime.datetime.now().strftime("%Y-%m-%d")  for device in devices:     net_connect = ConnectHandler(**device)     net_connect.enable()     hostname = net_connect.find_prompt().strip('#')     config_output = net_connect.send_command('show running-config')          # сохранение конфигурации в файл     with open(f'{hostname}_backup_{current_date}.txt', 'w') as file:         file.write(config_output)          net_connect.disconnect()

Скрипт подключается к каждому устройству, извлекает текущую конфигурацию с помощью команды show running-config и сохраняет ее в файл, используя имя устройства и текущую дату для именования файла.


Хотите узнать больше о Python и других языках программирования? В каталоге курсов OTUS найдутся актуальные курсы от действующих экспертов рынка по любым направлениям. Переходите в каталог и убедитесь сами.


ссылка на оригинал статьи https://habr.com/ru/articles/822647/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *