Сегодня рассажем о модуле, который упрощает автоматизацию сетевых устройств — Netmiko. Если вы, как и мы, когда-то пытались автоматизировать конфигурации и управление сетью через SSH, то вы знаете, насколько это может быть сложным процессом. И тут на сцену помогает Netmiko.
Netmiko — это обертка над библиотекой Paramiko, разработанная для сетевых инженеров. Она упрощает работу с SSH-соединениями и добавляет ряд методов и интерфейсов для взаимодействия с сетевыми устройствами.
Этот модуль поддерживает большой спектр сетевых устройств — от Cisco и Juniper до Arista и HP. Всё, что нужно, это определить параметры устройства в виде словаря, и Netmiko позаботится обо всем остальном.
Установим:
pip install netmiko
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()
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 имеет пару параметров, которые можно использовать для настройки выполнения команды:
# определение конфигурационных команд
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 имеет и другие хорошие методы:
В крупных честка часто необходимо обновлять конфигурации на множестве маршрутизаторов одновременно. С помощью 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 и сохраняет ее в файл, используя имя устройства и текущую дату для именования файла.
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).
# определение конфигурационных команд
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 имеет и другие хорошие методы:
- Метод send_command_timing:
- Аналогичен send_command, но основан на тайминге. Хорош, когда вывод команды может изменяться со временем, и требуется больше контроля над ожиданием вывода.
output = net_connect.send_command_timing('show version')
print(output)
- Аналогичен send_command, но основан на тайминге. Хорош, когда вывод команды может изменяться со временем, и требуется больше контроля над ожиданием вывода.
- Метод save_config:
- Позволяет сохранить текущую конфигурацию на устройстве (мы его уже рассмотрели в примерах выше, но стоит его тут отметить):
output = net_connect.save_config()
print(output)
- Позволяет сохранить текущую конфигурацию на устройстве (мы его уже рассмотрели в примерах выше, но стоит его тут отметить):
- Метод 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 и сохраняет ее в файл, используя имя устройства и текущую дату для именования файла.
Netmiko: упрощение сетевой автоматизации на Python
Привет, Хабр! Сегодня рассажем о модуле, который упрощает автоматизацию сетевых устройств — Netmiko . Если вы, как и мы, когда-то пытались автоматизировать конфигурации и управление сетью через SSH,...
habr.com