А АFriday, 24 September 2021

Автоматизация сетевых задач - Netmiko.

Всем привет.

Продолжим тему автоматизации сетевых задач с библиотекой Netmiko. Итак, Netmiko - это Python библиотека для работы с сетевыми устройствами, в качестве инициализации соединений она использует Paramiko, но содержит много встроенных методов и классов "под капотом".

Библиотека не входит в список стандартных модулей для Python 3, поэтому ее требуется установить:

pip install netmiko

В первую очередь рекомендовано ознакомиться со списком поддерживаемых сетевых ОС, из стабильных это:

Arista vEOS

Cisco ASA

Cisco IOS

Cisco IOS-XE

Cisco IOS-XR

Cisco NX-OS

Cisco SG300

HP ProCurve

Juniper Junos

Linux


Синтаксис и логика.

Напомню, в 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)

 logging synchronous

В 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.

Удачи.

No comments:

Post a Comment

А что вы думаете по этому поводу?

Версия на печать

Популярное