Python как зайти на коммутатор

Обновлено: 06.07.2024

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

Сегодня же мы продолжим знакомиться с инструментами, в частности с модулем ЯП (язык программирования) Python - Telnetlib. Поговорим о задачах с множественным созданием объектов, затронем процедуру бэкапа конфигурации.

Оффтоп: Отмечу активное обсуждение первой статьи, спасибо за ваши мнения и мысли, особенно если они по делу.

Цель нашего цикла - показать инструменты и рассказать о технологиях в мире автоматизации работы сетевого администратора. Учитывая большое количество вендоров в конечной инфраструктуре, мы намеренно используем средства, которые так или иначе унифицированы и подойдут большинству из вас.

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

Кейс по созданию VLAN

Итак, вы сетевой инженер или администратор сети, которому поставили задачу сконфигурировать на L2-коммутаторе некоторое количество VLAN-интерфейсов. Допустим, для 2-4 интерфейсов вы быстро отправите команды в CLI (либо через другую оболочку), но что делать если нужно создать 10,50,100 VLAN ?

Конечно возможно подготовить заранее сконфигурированный файл-шаблон и скопировать его терминал оборудования, но это не так интересно, как написать скрипт, который сделает это автоматически.

Напомню, что мы познакомились уже с Python-библиотекой TelnetLib, она способна подключаться к оборудованию с помощью одноименного протокола Telnet и передавать команды. Пришло время применить наши знания, но вначале кратко о макете:

Виртуальное оборудование настроено в достаточно известном эмуляторе GNS3 и включает в себя:

1. Host-машина в виде Docker Container - "Network Automation". Этот предустановленный объект есть в GNS3, в нем содержатся необходимые пакеты для автоматизации, в том числе Python3.

2. L2-коммутатор - "S(1-6)". На макете используется оборудование Cisco, единственная проблема это образ ОС - IOS (15.2), он распространяется платно, но вы можете установить оборудование и других вендоров.

Автоматизация работы сетевого администратора, часть 2. Практические кейсы с Telnetlib

3. L3 маршрутизатор - "R1" . Также эмулируется оборудование Cisco c IOS (15.6).

Автоматизация работы сетевого администратора, часть 2. Практические кейсы с Telnetlib

Сама схема топологии сети представлена ниже:

Автоматизация работы сетевого администратора, часть 2. Практические кейсы с Telnetlib

"ЕСЛИ требуется пароль, то передать"

"Cоздание VLAN"

И все вроде бы неплохо в приложенном скрипте ( он даже работает), кроме того что мы конфигурируем лишь 1 коммутатор и вручную прописываем каждый VLAN, хотя меняется лишь его номер. То есть фактически задача по автоматизации конфигурирования большого числа VLAN не выполнена. Пришло время обратиться к циклам, сегодня говорим о FOR.

Краткая теория для цикла FOR

Очень часто одно и то же действие необходимо выполнить для набора однотипных данных. Например, преобразовать все строки в списке в верхний регистр. Для выполнения таких действий в Python используется цикл FOR.

FOR перебирает по одному элементу из указанной последовательности и совершает над ним определенные действия, которые вы укажите .

Автоматизация работы сетевого администратора, часть 2. Практические кейсы с Telnetlib

  1. Создается переменная words (тип список) и в нее записываем 3 строки.
  2. Создается переменная upper_words (пустой список) .
  3. Цикл FOR перебирает каждый элемент из списка words
  4. В переменную upper_words добавляется каждый элемент из списка в words - append, при этом применяется метод upper ( преобразование в верхний регистр).
  5. Выводим на экран переменную upper_words и видим что цикл прошелся по всему списку words, преобразовал каждую строку в верхний регистр и записал их в новый список (upper_words).


В рамках FOR нам понадобится использовать функцию - range, она позволяет перебирать заданный диапазон чисел, выглядит это так:

Важное замечание: переменная n изначально идет как число (тип integer), поэтому при выводе на экран мы ее преобразуем в строку (тип str).

Тем, кому до сих пор осталось ничего не понятно, рекомендую почитать теорию о циклах: 1 статья, 2 статья и т.п.

Мы же вернемся к задаче конфигурирования большого числа VLAN на L2-коммутаторе и перепишем первичный скрипт с учетом знакомства с циклом FOR и функцией range:

"ЕСЛИ требуется пароль, то передать"

"Запуск цикла с перебором переменной n от 2 до 101"

Итак, скрипт идентичен с первым, но мы добавили цикл FOR и функцию range, они позволяют избавиться от строчек с ручной передачей конкретного VLAN. Теперь задается диапазон необходимых значений, на основе которых меняется строка типа: vlan№ , в которую подставляется переменная "n".

Кейс по созданию бекапа на L2-коммутаторах

Мы уже умеем использовать цикл FOR для задания VLAN, в следующем практическом примере попробуем автоматизировать процесс работы с несколькими L2-коммутаторами и соберем копию конфигурацию на хостовую машину:

Cкрипт будет использовать файл "myswitches" в нем содержатся IP-адреса L2-коммутаторов (S1-S6).

"Запуск цикла с перебором IP-адреса (из файла myswitches)"

"ЕСЛИ требуется пароль, то передать"

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

Шпаргалка по сетевому программированию на Python

Все таблицы, представленные в шпаргалках, также представлены в таблицах ниже, которые легко скопировать и вставить.

Шпаргалка по сетевому программированию на Python крышки:

  • Обязательные общие установочные модули: PIP и IDLE
  • Лучшие библиотеки сетевого программирования Python
  • Сетевая экспертиза: необходимые библиотеки и скрипты на python
  • Ключевые слова Python
  • Типы данных, математические операторы
  • Анализ сети с помощью Python
  • Библиотека dnspython
  • Socket Module (интерфейс API Беркли)
  • Типы сокетов, создание сокетов
  • Примеры сокетов
  • Примеры скриптов
  • Модули разбора

Посмотреть или скачать Cheat Sheet JPG изображение

Щелкните правой кнопкой мыши на изображении ниже, чтобы сохранить файл JPG (1987 ширина x 2362 высота в пикселях), или нажмите здесь, чтобы открыть его в новой вкладке браузера. Как только изображение откроется в новом окне, вам может потребоваться нажать на изображение, чтобы увеличить его и просмотреть полноразмерный файл JPEG..

Шпаргалка по сетевому программированию на Python

Просмотреть или скачать PDF-файл шпаргалки

Загрузите PDF-файл шпаргалки здесь. Когда он откроется в новой вкладке браузера, просто щелкните правой кнопкой мыши на PDF и перейдите в меню загрузки.

Что входит в этот шпаргалку

Следующие категории и предметы были включены в шпаргалку:

Обязательные общие установочные модули: PIP и IDLE

PIP (установщик пакетов Python)

IDLE (интегрированная среда разработки и обучения)

Лучшие библиотеки сетевого программирования Python

Веб-фреймворк Python высокого уровня для быстрой и прагматичной разработки

Пикос (ранее Асинкоро)

Платформа Python для асинхронного, параллельного, сетевого, распределенного программирования и распределенных вычислений

Простой способ создания масштабируемых сетевых программ

Уровень абстракции сетевой автоматизации и программируемости с поддержкой нескольких поставщиков - для работы с поставщиками услуг

Сетевая библиотека на основе сопрограмм Python, которая использует greenlet для обеспечения высокоуровневого синхронного API поверх цикла событий libev или libuv

Сетевая экспертиза: необходимые библиотеки и скрипты на python

Агент системного и сетевого мониторинга, безопасности и анализа производительности для python

Инструмент для захвата небольших пакетов на основе Python и PCAP

Реализация протокола SSHv2, обеспечивающего функциональность как клиента, так и сервера

Установщик пакетов для python

Индекс пакетов Python (PyPI)

Репозиторий программного обеспечения для Питона

Ключевые слова Python

Python 2.7.15+ ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'кроме', 'exec', ' наконец, ',' для ',' из ',' global ',' if ',' import ',' in ',' is ',' lambda ',' not ',' или ',' pass ',' print ' , 'Raise', 'Return', 'Try', 'while', 'with', 'yield']

Python 3.8.0 ['False', 'None', 'True', 'и', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', ' del ',' elif ',' else ',' кроме ',' finally ',' for ',' from ',' global ',' if ',' import ',' in ',' is ',' lambda ' , 'нелокальный', 'not', 'или', 'pass', 'повысить', 'return', 'try', 'while', 'with', 'yield']

Типы данных

ул - х = "Привет, мир"

int, float, комплекс

список, кортеж, диапазон

байты, bytearray, просмотр памяти

Математические операторы

экспонент 4 ** 2 = 16

Modulus / Остаток 43% 5 = 3

Целочисленное деление 11 // 5 = 2

разделение 11/5 = 2,2

умножение 3 * 3 = 9

Вычитание 8 - 3 = 5

прибавление 2 + 2 = 4

Меньше или равно

Больше или равно

Комментарии

Может использоваться в начале строки или изнутри строки до конца строки

Анализ сети с помощью Python

Используйте NMAP со сканером портов

Команды для запуска сканирования NMAP

Команды NMAP, используемые с python

Библиотека dnspython

Получить цель MX и имя предпочтения

Socket Module (интерфейс API Беркли)

Основные функции и методы

socket () • ind () • listen () • accept () • connect () • connect_ex () • send () • recv () • close ()

Типы сокетов

Для протоколов TCP • Надежная передача • Последовательность пакетов • Ориентированный на соединение • Двунаправленный

Для протоколов UDP • Ненадежная передача • Нет последовательности пакетов • Без установления соединения (UDP) • Не двунаправленный

Создание сокетов

SOCK_STREAM или SOCK_DGRAM для TCP & UDP соответственно

Например, TCP - UDP2 = сокет. сокет (socket.AF_INET, socket.SOCK_DGRAM)

Например, UDP - TCP2 = сокет. сокет (socket.AF_INET, socket.SOCK_STREAM)

Метод клиентского сокета

Метод сокета сервера

Методы сокетов TCP

Методы сокета UDP

Больше методов сокетов

Закройте разъем сокета

Возвращает строку, которая включает имя хоста текущего ПК

Возвращает строку, которая включает имя хоста и IP-адрес текущего ПК

Настройка и запуск прослушивателя TCP

Присоедините (имя хоста, номер порта) к сокету

Ожидание TCP-соединения с клиентом

Инициировать соединение с сервером TCP

Возвращает кортеж с удаленным адресом, который подключился

Прикрепить указанный локальный адрес к сокету

Данные, отправленные через сокет, присваиваются данному удаленному адресу

Возвращает удаленный адрес, к которому подключен сокет

Возвращает адрес собственной локальной конечной точки сокета

Принудительно установить пакет данных на определенный удаленный адрес

Удалить / удалить блок

Получить номер порта, используя доменное имя

Проверьте поддержку IPV6

getaddrinfo () - привязывает сервер к порту

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

Пример сокета на стороне клиента

Пример сокета на стороне клиента с комментариями

г. Санкт-Петербург, Крестовский остров, Северная дорога, дом 12.

г. Санкт-Петербург, ст. м. «Приморская»,
ул. Одоевского, д. 24 к. 1, 2 этаж

MikroTik RouterOS API

Заключительная часть цикла посвящена использованию централизованного инструмента управления устройствами с помощью API RouterOS с примерами для языка Python3.

АНОНС

Первая часть цикла: Скрипты RouterOS

Вторая часть цикла: MikroTik Ansible

В цикле статей «Автоматизация при эксплуатации оборудования MikroTik RouterOS» представлен обзор средств автоматизации, применяемых при эксплуатации оборудования на базе RouterOS. Решения применимы как к аппаратным решениям MikroTik, так и к облачным решениям, построенным на базе RouterOS.

Заключительная часть цикла посвящена использованию централизованного инструмента управления устройствами с помощью API RouterOS с примерами для языка Python3.

Использование API RouterOS

В рамках этой статьи будет рассматриваться взаимодействие с устройством через специальный программный интерфейс управления (API — application programming interface). По функциональности этот интерфейс аналогичен конфигурации устройства через telnet или ssh. Отличие состоит в том, что telnet и ssh относятся к интерфейсам взаимодействия устройства и человека, а API — взаимодейтствия устройства и устройства, т.е. MikroTik API как нельзя лучше подходит для целей автоматизации.

Ранее было сказано, что в качестве языка программирования при демонстрации работы с API RouterOS будет использоваться Python 3. RouterOS API Python 3 поддерживает взаимодействие с сетевыми устройствами через протоколы telnet и ssh, однако работа с этими модулями трудоёмка, например, результат выполнения команды необходимо выделять с помощью регулярного выражения из общего ответа устройства. Одним из модулей, который значительно упрощает взаимодействие с сетевыми устройствами, является модуль netmiko, однако на текущий момент в нём не реализована поддержка RouterOS. Синтаксис языка Python 3 в рамках статьи рассматриваться не будет.

Для взаимодействия с устройством необходимо включить поддержку API непосредственно на устройстве, перейдя в раздел “/ip services”. По-умолчанию API работает через порт 8728. Кроме того, RouterOS поддерживает защищённый вариант программного интерфейса API over SSL (api-ssl по-умолчанию использует порт 8729).

Разработчики RouterOS не предоставили библиотеки для работы через API для популярных языков программирования, однако описали протокол взаимодействия в официальной документации. Помимо описания протокола взаимодействия представлены примеры программ, в том числе для языка Python 3.

Взяв за основу файл с примером, при подготовке статьи был описан файл с классом ApiRos, позволяющий выполнить подключение и взаимодействие с устройством через API. Помимо этого, были добавлены три функции: для открытия/закрытия сокета и вывода ответа устройства на экран. При демонстрации будут использованы следующие функции и классы:

  • libapi — файл библиотеки, подготовленный для статьи. Файл содержит основные функции и классы для взаимодействия с устройством;
  • ApiRos — класс устройств под управлением RouterOS;
  • socketOpen — функция открытия сокета;
  • socketClose — функция закрытия сокета;
  • login — функция авторизации на устройстве;
  • writeSentence — функция отправки команды на устройство;
  • readResponse — функция получения результата выполнения команды с устройства.

Следует упомянуть о формате команд, т.к. он отличается от синтаксиса, используемого при конфигурации вручную. Команды вводятся в виде списка, где первый элемент — команда, в которой пробелы заменяются на символ “/”, а последующие элементы уточняют запрос:

Доброго здоровья всем Есть цель сделать скрипт для автологина при входе на коммутаторы через telnet. Изначально думал сделать банально, чтобы скрипт читал вывод до слов username и password, а всё остальное делать ручками. Однако до моих ушей дошла идея, что можно в этом деле еще заюзать snmp, дабы он перед подключением получал версию прошивки свича и в зависимости от этого производил некие дополнительные действия (вход в режим конфигурации и ввод того или иного логина на свичах без радиуса). Сел курить подробно статьи о работе snmp, однако пока что к сожалению удалось понять только основы как оно работает, без понимания синтаксиса конкретных команд, не говоря уже о том как это заюзать в питоне. Очень рассчитываю на Вашу помощь в этом вопросе, возможно кто-то подскажет где можно более детально получить информацию на этот счёт, т.к. гуглинг пока что дал в основном основную информацию о работе протокола.




Проблема в первую очередь в понимании непосредственно SNMP составляющей. Того как формируются запросы и их OID. Не отрицаю того, что я криворукий, однако так и не нашёл непосредственно списка того какие запросы есть и какой ключ за что отвечает.


Кажется там много вендер-специфичного.


О, тут спасибо. Об этом не знал, по запросам snmp %switchname% уже больше полезной инфы вижу. ^_^



На питоне по той причине, что скрипт планируется использовать как на линухе так и на окне.

А что вы собрались выполнять после автологина по телнету?


Постараюсь более подробно описать ситуацию. Более ярко подойдёт пример со шлюзами. И так, есть 3 варианта шлюзов, на каждом из типов свои локальные логин и пароль: циска и 2 варианта зте-шек с разными прошивками. Вот и хочу, дабы скрипт узнавал с кем он имеет дело и вставлял в зависимости от этого нужные данные. А дальше уже то что мне необходимо я руками делать буду через телнет. Примерно такая картина и со свичами, только там не так ярко т.к. на большинстве из них есть радиус.



Я всё понимаю, но можно я буду решать что мне нужно, а что нет? ^_^" Для каждого из девайсов настроить сессию довольно таки геморно, т.к. их несколько тысяч по всей стране и узнаю я к устройству какого вендора присоединился лишь пост-фактум, уже увидя приветствие свича.

Читайте также: