Главная


Showing posts with label paramiko. Show all posts
Showing posts with label paramiko. Show all posts

Sunday, 1 January 2023

Тестирование инфраструктуры c pyATS #3.

Всем привет. 

Продолжаю нашу тему фреймворков для тестирования инфраструктры. Сегодня мой пост является беглым отчетом по выполнению работы "7.6.3 Lab - Automated Testing Using pyATS and Genie" из Cisco DevNet.

Знакомтесь - pyATS (https://developer.cisco.com/pyats/). Это экосистема сквозного тестирования, изначально разработанная компанией Cisco и ставшая открытой в конце 2017 года. Ранее библиотека pyATS называлась Genie; эти названия используются в одном и том же контексте. Ввиду своего происхождения этот фреймворк целиком и полностью ориентирован на тестирование сетей.

Фреймворк доступен в PyPI:

(venv) $ pip install pyats[full]

Для начала рассмотрим некоторые демонстрационные сценарии из GitHub-репозитория:

git clone https://github.com/CiscoTestAutomation/examples

Мы сходу можем прогнать тест-пустышку чтобы оценить как все происходит:

pyats run job examples/basic/basic_example_job.py

Следом можно охватить отчетность по всем проведенным PyATS-тестам в формате HTML:

pyats logs view

P.S.: имейте ввиду - порт web-сервера отчетов динамический.


Ок, реальные тесты начинаются с создания файла испытательной модели (testbed) в формате YAML. Создадим простой testbed-файл testbed-pyats.yml для нашего устройства CSR1000v. Он похож на файл реестра hosts, знакомый нам от Ansible:

testbed: 

    name: pyATS

    credentials:

        default:

            username: admin

            password: super

        enable:

            password: super


devices:

    CSR: 

        alias: CSR

        type: iosxe

        connections:

            defaults:

                class: unicon.Unicon  

            vty:

                ip: 192.168.1.19

                protocol: ssh -o KexAlgorithms=diffie-hellman-group14-sha1

Tuesday, 27 December 2022

Тестирование инфраструктуры с Testinfra #2.

Всем привет.

Усвоив идею тестирования на Testinfra и переориентировав ее для проверки системы, можно добиться очень многого. Автоматизация запуска тестов в ходе разработки приложений или даже написания и выполнения тестов для существующей инфраструктуры - два прекрасных способа упростить рутинные операции, которые могут вызвать ошибки. Рytest и Testinfra - отличные проекты, начать использовать их очень просто, к тому же при необходимости они легко расширяются. Самое естественное начало разработки проверочных тестов - во время создания самой инфраструктуры. Любое усовершенствование требует нового теста. 

Сегодня погоняем пару теcтов через Testinfra.

Вам понадобится установить web-сервер и запустить его на порту 80 для выдачи статической стартовой страницы. По мере достижения прогресса мы будем добавлять новые тесты. Неотъемлемой составляющей написания тестов является осознание сбоев, так что смоделируем несколько проблем, на примере которых будем разбираться, что нужно исправить.

На свежем сервере Ubuntu начните с установки пакета Nginx:

$apt install nginx

Создайте новый файл теста test_webserver.py, в который мы будем постепенно

добавлять тесты:

def test_nginx_is_installed(host):

assert host.package('nginx').is_installed

Сделаем вывод pytest лаконичнее с помощью флага -q, чтобы сосредоточить свое внимание на сбоях. Удаленный сервер называется node4, для подключения к нему используется SSH. Вот команда для запуска первого теста:

(validate) $ pytest -q --hosts='ssh://node4' test_webserver.py

1 passed in 1.44 seconds

Отлично! Необходимо, чтобы веб-сервер был запущен и работал, так что добавляем новый тест для проверки этого поведения:

def test_nginx_is_running(host):

assert host.service('nginx').is_running


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

(validate) $ pytest -q --hosts='ssh://node4' test_webserver.py

.F

= FAILURES ===================================

_____________________ test_nginx_is_running[ssh://node4] ______________________

host = <testinfra.host.Host object at 0x7f629bf1d668>

def test_nginx_is_running(host):

> assert host.service('nginx').is_running

E AssertionError: assert False

E + where False = <service nginx>.is_running

E + where <service nginx> = <class 'SystemdService'>('nginx')

test_webserver.py:7: AssertionError

1 failed, 1 passed in 2.45 seconds

Sunday, 25 December 2022

Тестирование инфраструктуры с Testinfra #1.

Всем привет.

Создание модульных тестов для тестирования инфраструктуры - замечательная идея. Главное найти подхоящий инструмент с низким порогом вхождения. Я таких знаю два - это Testinfra  (Python) и Pester (Powershell). Разумеется оба бесплатны, но более простым для старта я считаю первый. Так что сегодня будет Testinfra.

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

Пожалуй начнем. Создайте новую виртуальную среду и активируйте ее:

$ python3 -m venv validator

$ source validator/bin/activate

Установите  pytest:

(validator) $ pip3 install pytest

Установите testinfra:

(validator) $ pip3 install pytest-testinfra

Установите paramiko:

(validator) $ pip3 install paramiko

Фикстуры pytest предоставляют всю тестовую функциональность проекта Testinfra.  Чтобы извлечь пользу из этого, вам необходимо правильно указать тип соединения. Поскольку  существуют различные типы соединений прикладных частей, то, если соединение не указано непосредственно, Testinfra использует определенные типы по умолчанию. Лучше указывать тип соединения явным образом в командной строке.

Вот список поддерживаемых Testinfra соединений на сегодня:

-local

$ py.test --sudo test_myinfra.py

-Paramiko (SSH-реализация на Python)

$ py.test --ssh-config=/path/to/ssh_config --hosts=server

-Docker;

$ py.test --hosts='docker://[user@]container_id_or_name'

-SSH;

$ py.test --ssh-config=/path/to/ssh_config --hosts='ssh://server'

-Podman;

$ py.test --hosts='podman://[user@]container_id_or_name'

-Salt;

$ py.test --hosts='salt://*'

-Ansible;

$ py.test --hosts='ansible://all' # tests all inventory hosts

-Kubernetes (через утилиту kubectl);

$ py.test --hosts='kubectl://mypod-a1b2c3'

-OpenShift;

$ py.test --hosts='openshift://mypod-a1b2c3'

-WinRM;

$ py.test --hosts='winrm://vagrant@127.0.0.1:2200?no_ssl=true&no_verify_ssl=true'

-LXC/LXD

$ py.test --hosts='lxc://container_name'

Tuesday, 18 January 2022

Фреймворки Scapy, Scrapli и Scrapy.


Всем привет.

Однажды мне удалось перепутать фреймворк Scapy со Scrapli. Оказалось этого мало - ведь есть еще один фреймворк под именем Scrapy. Что было с фантазией авторов на имена, но все фреймворки существуют по сей день, и служат совершенно разным целям. Поэтому пройдемся кавалерийским шагом по каждому.

Фреймворк Scapy.

Scapy является мощной программой интерактивной манипуляции пакетами на основе Python. Я на это ней уже пару раз останавливался.

Фреймворк Scrapli.

Scrapli это модуль, который позволяет подключаться к сетевому оборудованию используя Telnet, SSH или NETCONF. Также как и netmiko, Scrapli может использовать paramiko или telnetlib (и другие модули) для самого подключения, но при этом предоставляет одинаковый интерфейс работы для разных типов подключения и разного оборудования.

Установка scrapli:

pip install scrapli

Три основные составляющие части Scrapli:

• transport - это конкретный способ подключения к оборудованию

• channel - следующий уровень над транспортом, который отвечает за отправку команд, получение вывода и другими взаимодействиями с оборудованием

• driver - это интерфейс, который предоставляется пользователю для работы со scrapli.

Тут есть как специфические драйверы типа IOSXEDriver, который понимает как взаимодействовать с оборудованием конкретного типа, так и базовый драйвер Driver, который предоставляет минимальный интерфейс для работы через SSH/Telnet.

Saturday, 25 September 2021

Практикум с Netmiko.

Всем привет.

Продолжаем  автоматизировать рутинные процессы сетевого администрирования c Никитой Турковым. Сегодняшняя статья будет посвящена примерам и описанию работы скриптов, в которых также используем Netmiko и Python.

Обработка ошибок.

До сих пор мы рассматривали различные решения и не касались работы с ошибками при работе программы со стороны пользователя или сервера (в нашем случае - сетевое оборудование). 

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

Возможные причины сбоя вашего скрипта:

1. Некорректные аутентификационные данные.

2. Истек таймаут для подключения.

3. Прерывание передачи трафика.

4. Недоступность порта SSH со стороны сервера.

5. Различные другие ошибки.

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

Для этого в Python есть конструкция try / except.

try:

  BLOCK

except CODE_ERROR as err:

    print("OS error: {0}".format(err))

То есть, в блоке "Try" мы пытаемся выполнить какой-либо код , он может вызвать ошибку, тогда мы пробуем ее обработать и получить о ней вывод - с помощью блока "Except". При этом скрипт продолжит свою работу далее, если это не последние шаги в программе.

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

Thursday, 23 September 2021

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

Всем привет.

Сегодня транслирую вам материал Никиты Туркова про автоматизацию работы сетевого администратора  с использованием пакетов Paramiko и Netmiko.

Автоматизация процесса обслуживания сетевых устройств невозможна без использования хтоя бы одного из языков программирования. Для 2021 года базовое знание Python это уже не преимущество кандидата (системного администратора, или сетевого инженера) , а одно из требований при трудоустройстве на работу.  Одно из весомых преимуществ языка Python - большое количество сторонних библиотек для решения задач из различных областей. Естественно, энтузиасты и разработчики в рамках работы с сетью и сетевым оборудованием написали достаточное количество модулей. Перечислим те из них, которые поддерживают режим взаимодействия CLI:

• telnetlib - встроенная библиотека, она используется для обеспечения доступа к сетевому устройству и отправке команд по Telnet протоколу (не является безопасным).

• pexpect - внешняя библиотека работает для передачи данных по протоколам: ssh, telnet, sftp и др. Считается универсальным инструментом для передачи команд как в ОС, так и на сетевое оборудование. Логика работы основана на ожидании получения соответствующей строки от устройства и дальнейшей отправки команды. 

• paramiko - внешняя библиотека, обеспечивающая организацию SSH-соединения. Работает в режиме клиента и сервера, соответственно в качестве передачи данных может использоваться только протокол SSH.

• netmiko - внешняя библиотека от сообщества сетевых инженеров и администраторов, была разработана специально для взаимодействия с сетевым оборудованием различных производителей (адаптация под сетевую ОС). Netmiko включает в себя paramiko, описанный раннее.

Наиболее популярные из них это Paramiko и Netmiko. Сегодня мы рассмотрим модуль Paramiko.

SSH и Paramiko.

Paramiko - это реализация протокола SSHv2 на Python. Paramiko предоставляет функциональность клиента и сервера. В рамках статьи будет рассматриваться лишь функциональность клиента, серверную часть возможно изучить самостоятельно.

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

pip install paramiko

В Python3 есть отличная возможность тестировать ваши скрипты, отправляя одиночные команды, для этого достаточно лишь вызвать сам интерпретатор:

python3

Логика работы Paramiko: 

1. создание клиента подключения SSH;

2. настройка клиента подключения SSH;

3. выполнение подключения SSH;

4. переход в интерактивный режим отправки команд для подключения SSH.

Версія на друк

Популярне