Автоматизация 4. Netmiko

11 март 2021 07:40 #100791 от ICT
ICT создал тему: Автоматизация 4. Netmiko
Предыдущие статьи циклаАвтоматизация работы сетевого администратора.Автоматизация работы сетевого администратора, часть 2. Практические кейсы с Telnetlib.Автоматизация работы сетевого администратора. Часть 3. Знакомство с Paramiko. Приветствую читателей цикла об автоматизации работы с сетевым оборудованием, после чуть затянувшегося перерыва мы продолжаем писать о различных программных инструментах . В конце предыдущей статьи, в которой мы познакомились с Paramiko, был упомянут модуль, разработанный сетевыми инженерами для сетевых инженеров. Введение Итак, Netmiko - это Python библиотека для работы с сетевыми устройствами, в качестве инициализации соединений она использует Paramiko, но содержит много встроенных методов и классов "под капотом". Библиотека не входит в список стандартных модулей для Python 3, поэтому ее требуется установить: pip install netmiko В первую очередь рекомендовано ознакомиться со списком поддерживаемых сетевых ОС, из стабильных это:Arista vEOSCisco ASACisco IOSCisco IOS-XECisco IOS-XRCisco NX-OSCisco SG300HP ProCurveJuniper JunosLinux
Кратко об истории создания: Разработчики, в частности сетевые инженеры, часто сталкивались с архитектурными (системными) ограничениями того или иного сетевого оборудования при написание различных скриптов, что не позволяло унифицировать его применение и вызывало ошибки выполнения. Например, HP ProCurve свитчи выводят символы в ANSI-кодировке или Cisco требует дополнительные режимы в терминале (enable, configure terminal ) и пр. Это побудило написать библиотеку Netmiko, где уже будет задана логика взаимодействия с сетевым устройством в зависимости от его ОС. Синтаксис и логика Напомню, в Python3 есть удобная возможность тестировать команды, для этого достаточно лишь вызвать сам интерпретатор: python3 Первично, нужно импортировать функцию ConnectHandler и подготовить переменную типа словарь, в котором будут заданы необходимые параметры для SSH-подключения. In [1]: from netmiko import ConnectHandler In [2]: cisco = {
...: "device_type": "cisco_ios",
...: "host": "cisco.domain.com",
...: "username": "admin",
...: "password": "cisco123",
...: } После того, как определили "device_type": "cisco_ios", можем создавать соединение с устройством. Список поддерживаемых видов ОС доступен по ссылке. Для удобства передадим функцию в переменную "net_connect", ее будет использовать далее при отправке команд и т.д. In [3]: net_connect = ConnectHandler(**cisco) С помощью ** мы передаем ключ-значение в функцию ConnectHandler, более подробно о теории по ссылке. Альтернативно возможно отправить параметры функции вручную: net_connect2 = ConnectHandler(device_type="cisco_ios", host="cisco.domain.com", username="admin", password="cisco123") После создания переменной "net_connect" и загрузки в нее параметров, можно убедиться что SSH-соединение установлено: In [5]: net_connect.find_prompt()
Out[5]: "cisco3#" Получен ответ (Out[5]:) от сетевого устройства, сессия активна, находимся в режиме enable (Cisco OS). Сбор данных с одного устройства В качестве первой задачи после подключения, рассмотрим получение вывода результата выполнения команды на экране пользователя (инициатора скрипта). Благодаря прописанной логике, в Netmiko достаточно вызвать следующий метод: In [6]: output = net_connect.send_command("show ip int brief")
In [7]: print(output) Что произошло внутри ? В строке 6 была определена переменная "оutput", которой был передан класс "net_connect" - с данными о подключение и вызван метод "send_command". Со стороны сетевого устройства: произошла успешная инициализация SSH-соединения, вход в режим enable и отправка команды "show ip int brief" в терминал.Далее осталось лишь записать вывод в переменную "оutput"и вывести ее на экран. Отработает ли метод, если внутри команды задать еще одно условие для выполнения? In [8]: output = net_connect.send_command("show run | inc logging")
In [9]: print(output) В In [8] передана команда с просмотром текущего конфига (show run) и ее вывод передан в конвейер Pipeline для команды "inc logging". Соответственно, результат представлен на скриншоте, запрашиваемый параметр выведен. Сбор данных с нескольких устройств После того, как рассмотрели сбор данных с одного устройства, выполним задачу по опросу нескольких сетевых устройств, причем в топологии будут различные вендоры (сетевые ОС). In [1]: from netmiko import ConnectHandler #Импорт библиотеки
"Создание словарей с информацией об устройствах" In [2]: cisco3 = {
...: "device_type": "cisco_ios",
...: "host": "cisco3.domain.com",
...: "username": "admin",
...: "password": "cisco123",
...: }
...:
In [3]: cisco_asa = {
...: "device_type": "cisco_asa",
...: "host": "10.10.10.88",
...: "username": "admin",
...: "password": "cisco123",
...: "secret": "cisco123",
...: }
...:
In [4]: cisco_xrv = {
...: "device_type": "cisco_xr",
...: "host": "10.10.10.77",
...: "username": "admin",
...: "password": "cisco123",
...: } Далее нам понадобится уже известный цикл FOR, с помощью которого мы сможем последовательно подключаться к каждому из сетевых устройств и предоставлять вывод: for a_device in all_devices:
...: net_connect = ConnectHandler(**a_device)
...: output = net_connect.send_command("show arp")
...: print(f"\n\n
Device {a_device["device_type"]}
")
...: print(output)
...: print("
End
") В примере будет запрошена таблица ARP: Задание настроек конфигурации В завершение сегодняшней статьи рассмотрим еще одну задачи по формированию списка VLAN на 3 сетевых коммутаторах: "Формирование словарей с данными о сетевых устройствах" iosv_l2_s1 = {
"device_type": "cisco_ios",
"ip": "192.168.122.72",
"username": "david",
"password": "cisco"
}
iosv_l2_s2 = {
"device_type": "cisco_ios",
"ip": "192.168.122.82",
"username": "david",
"password": "cisco"
}
iosv_l2_s3 = {
"device_type": "cisco_ios",
"ip": "192.168.122.83",
"username": "david",
"password": "cisco"
}
all_devices = [iosv_l2_s1, iosv_l2_s2, iosv_l2_s3]# Запись словарей в список "Запуск цикла для последовательного подключения к оборудованию"
for devices in all_devices:
net_connect = ConnectHandler(**devices) # считывание пары ключ-значение
for n in range (2,21): # внутренний цикл от 2 до 21
print ("Creating VLAN " + str(n)) # вывод на экран строки о создание VLAN с номером
config_commands = ["vlan " + str(n), "name Python_VLAN " + str(n)] # формирование команды для отправки
output = net_connect.send_config_set(config_commands)# отправка команды на устройство
print (output) # вывод на экран переданной конфигурации Небольшая шпаргалка по методам взаимодействия с оборудованием:net_connect.send_command() - отправка единичной команды, по умолчанию возвращает вывод;net_connect.send_command_timing() - отправка команды по таймингу, по умолчанию возвращает вывод;net_connect.send_config_set() - отправка списка команд;net_connect.send_config_from_file() - отправка конфигурации из указанного файла;net_connect.save_config() - сохранить текущую конфигурацию в режиме startup-config;net_connect.enable() - Вход в enable mode;net_connect.disconnect() - Закрытие соединения.
Вместо заключения Сегодня мы начали знакомиться с многофункциональной библиотекой Netmiko, разобрали некоторые практические задачи, которые вы уже сможете выполнить самостоятельно по аналогии с примерами. Планируется 2 статья по этой библиотеке, где уже будет больше практических примеров, позволяющих еще больше автоматизировать ваши рутинные задачи. Ссылка на источник


  • Сообщений: 103416

  • Пол: Не указан
  • Дата рождения: Неизвестно
  • Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

    Мы в соц. сетях