Вы находитесь на странице: 1из 29

Инструменты

NetDevOps
Обзор возможностей фреймворка
pyATS для тестирования состояния
сети на базе виртуальной
лаборатории Cisco Modeling Labs

Александр Горбачев
Консультант, NSALAB

IPD week, Май 2020


Давайте знакомиться
• Выпускник сетевой академии Cisco при Тюменском
государственном университете (2011)
• Инструктор-тренер сетевой академии Cisco с 2014 года
• Выпускник магистратуры по направлению Computer Science,
Binghamton University, NY (2017)
• Международный эксперт от России и автор конкурсных заданий
на чемпионатах WorldSkills International (2017, 2019)
и Euroskills (2018)
• Заведующий лабораторией сетевого и системного
администрирования при Тюменском государственном
университете (2017-2019)
• Консультант в сфере ИТ-образования и независимой оценки
квалификации ИТ-персонала (NSALAB, 2018-н.в.)
Что включают в себя понятия
DevOps и NetDevOps?

Инструментарий NetDevOps
О чем будем
говорить? Моделирование сети с помощью
Cisco Modeling Labs

Автоматизация проверки состояния


сети с помощью фреймворка pyATS
[Net[Dev]Ops] как явление
• DevOps — культурное явление, которое
стирает рамки разделения обязанностей
между разработчиками ПО (Development) и
системными администраторами (IT Operations)
• NetDevOps — предполагает отношение к
конфигурации сетевой инфраструктуры как
к коду, работа с которым наследует все
принципы, применяемые при разработке ПО
Историческое разделение между Dev и Ops
Характеристика Dev Ops

Приложения и как они выполняются, плюс


Зона ответственности: Приложения и как они работают инфраструктура (ОС, сети, сервисы, доступность,
безопасность, масштабирование, обслуживание)

Как к центру расходов, предоставляет и ведет учет


Отношение руководства: Как к центру прибыли, требует ресурсы
ресурсов

Время от времени (в случае эскалации


Ротация: Регулярно
инцидента до разработчиков)

Метрики Абстрактные (включая плохие метрики, Конкретные (соответствие SLA, количество закрытых
производительности: такие как количество строк кода в день) заявок в Service Desk)

Необходимые навыки: Больше глубокие, чем широкие Больше широкие, чем глубокие

Необходимая Высокая — новые фреймворки, быстрое Низкая — обоснование инвестиций, оправдание


«подвижность»: добавление новых фич багов и т.д. ожиданий, длинные сроки согласования и поставки
Основные принципы [Net[Dev]Ops]
Позволяет тратить время на решение
Автоматизация — наше всё новых проблем, увеличивая ценность
для бизнеса в затраченном времени

Изучение причин и обработка


Сбои в работе — это норма исключительных ситуаций вместо
«быстрофиксов»

Тестирование, интеграция,
Непрерывность на всех стадиях развертывание, мониторинг,
обратная связь
Инструментарий NetDevOps
Системы контроля версий

Непрерывная интеграция Репозитории артефактов

Управление конфигурацией Тестирование и проверка

Интерфейсы доступа Контроллеры

Платформы симуляции и виртуализации

Сервисы обеспечения Инфраструктурные Телеметрия и


безопасности сервисы мониторинг
Инструментарий NetDevOps
DEVASC 200-901 Exam Topics

1.0 Software 2.0 Understanding 3.0 Cisco platforms


development and and using APIs and development
design

5.3 Describe the use and roles of


network simulation and test tools 4.0 Application 5.0 Infrastructure 6.0 Network
(such as VIRL and pyATS) deployment and and automation fundamentals
security
Cisco Modeling Labs 2
• Система моделирования сетевой инфраструктуры
• Поставляется в виде виртуальной машины на базе
CentOS 8
• Поставляется вместе с образами эталонных платформ
IOSv, IOSvL2, ASAv, IOS XRv, NX-OS
• Взаимодействие с устройствами внутри симуляции
осуществляется через HTML5-консоль
• Поддерживает импорт любых KVM-совместимых
образов виртуальных машин и устройств других
производителей
• Personal версия позволяет запускать до 20 Cisco
устройств, Enterprise — по количеству лицензий
Demo: Моделирование сети
с помощью Cisco Modeling Labs
Python Automated
Test Systems
• Фреймворк для создания автоматизированных
тестов
• Написан на Python3
• Разработан в 2014 году для внутреннего
использования в Cisco Systems
• Доступен через репозиторий Python PyPI
pyATS vs WSC 2017 Mod C
pyATS vs WSC 2017 Mod C
Основные компоненты pyATS

Testbed Unicon AEtest Genie Easypy


Список узлов, Библиотеки Определение логики Библиотеки моделей Среда выполнения
которые вы управления тестирования данных и парсеров
тестируете устройствами
Testbed
Содержит информацию обо # ./default_testbed.yaml
testbed: | объект testbed
всех объектах тестируемой name: skill39-wsc2017-mod-c | имя топологии
топологии credentials: | список учетных записей
default: | учетная запись по умолчанию
username: '%ENV{PYATS_USERNAME}' | имя пользователя
password: '%ENV{PYATS_PASSWORD}' | пароль

devices: | объект devices


Описывается в формате HQ1: | устройство HQ1
YAML connections: | список доступных подключений
ssh: | профиль подключения
protocol: ssh | протокол подключения
ip: 10.0.191.101 | адрес подключения
port: 2222 | порт подключения
defaults: | значения по умолчанию
API CML2 поддерживает class: unicon.Unicon | библиотека подключения
автоматическую генерацию os: ios | тип операционной системы
series: iosv | серия операционной системы
pyATS testbed type: router | тип платформы
Unified connection (Unicon)
Содержит библиотеки для # ./unicon_test.py
from pyats.topology import loader
подключения к различным testbed = loader.load('default_testbed.yaml')
типам устройств hq1 = testbed.devices.HQ1
hq1.connect()
hq1.execute('show version')

hq2 = testbed.devices.HQ2
hq2.start_pool(alias = 'ssh_pool', via = 'ssh', size = 4)
Поддерживает протоколы hq2.ssh_pool.execute([
telnet, ssh и netconf 'show version',
'show ip interface brief',
'show ip eigrp neighbors',
'show ip ospf neighbors'
])
Поддерживает
параллельное подключение
и исполнение команд
Automation Easy Testing (AEtest)
Определяет модульную
структуру тестирования

Определяет логику
тестирования

Реализует поведение
юнит-тестов
Automation Easy Testing (AEtest)
# ./topology_test.py
Определяет модульную from pyats import aetest
структуру тестирования
class CommonSetup(aetest.CommonSetup):

@aetest.subsection
def connect_to_devices(self, testbed, steps):
for device in testbed.devices:
with steps.start('Connecting to %s' % device):
Определяет логику testbed.devices[device].connect()
тестирования
class CommonCleanup(aetest.CommonCleanup):

@aetest.subsection
def disconnect_from_devices(self, testbed, steps):
for device in testbed.devices:
Реализует поведение with steps.start('Disconnecting from %s' % device):
testbed.devices[device].disconnect()
юнит-тестов
Automation Easy Testing (AEtest)
# ./topology_test.py
Определяет модульную class Monitoring_and_backup(aetest.Testcase):
структуру тестирования
@aetest.test
def configuration_backup(self, testbed, steps):
with steps.start('Save config on HQ1’):
assert '!' in testbed.devices.HQ1.execute('write’)
with steps.start('Check backup on tftp server’):
assert testbed.devices.HQ1.hostname in
Определяет логику testbed.devices.RADIUS.execute("sudo ls /srv/tftp")
тестирования
@aetest.cleanup
def monitoring_and_backup_cleanup(self, testbed, steps):
with steps.start('Remove backups from tftp server’):
testbed.devices.RADIUS.execute("sudo rm -f /srv/tftp/*")

Реализует поведение
юнит-тестов
Automation Easy Testing (AEtest)
$ python topology_test.py --testbed default_testbed.yaml

Определяет модульную SECTIONS/TESTCASES RESULT


структуру тестирования ---------------------------------------------------------------------------
|-- common_setup PASSED
| `-- connect_to_devices PASSED
|-- Monitoring_and_backup PASSED
| |-- configuration_backup PASSED
| | |-- Step 1: Save config on HQ1 PASSED
| | `-- Step 2: Check backup on tftp server PASSED
Определяет логику | `-- monitoring_and_backup_cleanup PASSED
тестирования | `-- Step 1: Remove backups from tftp server PASSED
`-- common_cleanup PASSED
`-- disconnect_from_devices PASSED
+-------------------------------------------------------------------------+
| Summary |
+-------------------------------------------------------------------------+
Реализует поведение Number of ABORTED 0
Number of BLOCKED 0
юнит-тестов Number of ERRORED 0
Number of FAILED 0
Number of PASSED 3
Number of PASSX 0
Number of SKIPPED 0
Total Number 3
Success Rate 100.0%
pyATS Library: Genie.libs.parsers
На входе получает In [1]: hq1.parse('show ip eigrp neighbors')
+++ HQ1: executing command 'show ip eigrp neighbors' +++
неструктурированный show ip eigrp neighbors
вывод с устройства
EIGRP-IPv4 Neighbors for AS(2017)
H Address Interface Hold Uptime SRTT RTO Q Seq
(sec) (ms) Cnt Num
0 20.17.5.1 Gi0/2 12 4d19h 32 192 0 26
HQ1#
На выходе отдает
структурированный объект Out[1]:
{'eigrp_instance': {'2017': {'vrf': {'default': {'address_family': {'ipv4':
{'name': '', 'named_mode': False, 'eigrp_interface':
{'GigabitEthernet0/2': {'eigrp_nbr': {'20.17.5.1':
{'peer_handle': 0,
'hold': 12,
На данный момент 'uptime': '4d19h',
'srtt': 0.032,
доступно 2400+ парсеров 'rto': 192,
'q_cnt': 0,
'last_seq_number': 26}}}}}}}}}}}
pyATS Library: Genie.Conf
In [2]: sw3.execute('show vlan brief’)
API для взаимодействия с +++ SW3: executing command 'show vlan brief’ +++
VLAN Name Status Ports
устройством в режиме ---- -------------------------------- --------- --------------------------
конфигурации 1 default active Gi1/0
101 LAN1 active
102 LAN2 active
103 EDGE active Gi0/3

С помощью моделей можно In [3]: new_vlan_cfg = ['vlan 110', 'name new_vlan’]


описывать сервисы вне In [4]: sw3.configure(new_vlan_cfg)
+++ SW3: config +++
зависимости от ОС config term
SW3(config)#vlan 110
SW3(config-vlan)#name new_vlan
SW3(config-vlan)#end
Библиотеки моделей In [5]: sw3.execute('show vlan brief’)
данных поддерживаются +++ SW3: executing command 'show vlan brief' +++
VLAN Name Status Ports
для IOS-XE, IOS-XR и NX-OS ---- -------------------------------- --------- --------------------------
1 default active Gi1/0
101 LAN1 active
102 LAN2 active
103 EDGE active Gi0/3
110 new_vlan active
Easypy
# ./jobfile.py
Стандартная среда import os
from pyats.easypy import run
выполнения для тестовых from genie import testbed
скриптов pyATS
def main(runtime):
my_testscript = os.path.join('./topology_test.py’)
my_testbed = testbed.load(os.path.join('./default_testbed.yaml’))
run(testscript = my_testscript, testbed = my_testbed)
Дает возможность
агрегировать скрипты в $ pyats run job jobfile.py

работы (jobs)

Предоставляет удобный
интерфейс для вывода
результатов
Easypy
Стандартная среда
выполнения для тестовых
скриптов pyATS

Дает возможность
агрегировать скрипты в
работы (jobs)

Предоставляет удобный
интерфейс для вывода
результатов
Demo: Автоматизация проверки
состояния сети с помощью
фреймворка pyATS
Полезные линки
• Инфраструктура как код: обзор возможностей Ansible
для управления конфигурацией сетевой
инфраструктуры
• pyATS Documentation
• Unicon Documentation
• Genie Documentation
• Cisco DevNet Learning Labs
• NetDevOps Live!
• PCAP: Programming Essentials In Python
Полезные контакты

agorbachev@nsalab.org

facebook.com/menus12

t.me/a_gorbachev
Спасибо за внимание!