Nornir — Взаимодействие с оборудованием.

Emil Garipov
5 min readOct 25, 2019

--

Оглавление

  1. Как работает Yaml файл.
  2. Inventory
  3. Подключение к оборудованию.

В этой мини серии статей мы подробно рассмотрим автоматизацию сети на оборудовании Cisco, а также способы автоматизации конфигурации и работы узлов оборудования через фреймворк Nornir. Я уже писал об установке и начальной настройке Nornir в этой статье. Поэтому пока не буду на этом подробно останавливаться. В данной статье мы рассмотрим подключение к оборудованию через телнет. Стенд поднят на EVE-NG и для пущей наглядности будет использоваться физическая топология из проекта “CCIE за год”.

Рис. 1 Физическая топология.

Я сохраню конфигурацию для каждой части в репозитории своей учетной записи GitHub под названием nornir_automation. Ссылка на репозиторий будет представлена ниже.

Как работает YAML?

Прежде чем начнем разбирать сам Nornir, хотелось бы дать пояснение что такое YAML . YAML — это понятный человеку механизм хранения данных, который легко сопоставляется с общим типом данных в Python( вроде словаря ). Он поддерживает иерархические структуры, используя отступы в стиле Python для обозначения вложенности и поэтому файлы имеют согласованный и легко читаемый вид. Давайте рассмотрим внимательнее, что собой представляет YAML.

Рис.2 Файл YAML.

Как вы заметили, ключ YAML находится слева, а значение смещено направо. Т.е., если посмотреть на Рис.2, то видно, что Ключ L2 будет как значением для Ключа L1, так и Ключом для значения L2. Таким образом, внутри самого значения можно создать другую пару ключей и значений и так до тех пор, пока полностью не опишется конфигурация в “хорошо структурированном” формате YAML. Это позволит скрипту Python, который используется в Nornir, легко описать любую конфигурацию и отделить синтаксис разных вендоров от фактических значений. В части Inventory мы рассмотрим более подробно, как это работает в Nornir.

Когда вы создаете файл в YAML, вы должны помнить следующие основные правила :

  • YAML чувствителен к регистру
  • Файлы должны иметь расширение .yaml
  • При создании YAML-файлов нельзя пользоваться табуляцией, вместо этого используются пробелы.

Если хотите чуть глубже вникнуть в тему YAML, есть хорошая статья на хабре или обратиться к официальной документации.

Inventory

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

Следует отметить, что в Nornir система инвентаризации состоит из двух компонентов. Существуют основные объекты инвентаризации и подключаемые модули, которые подают/разделяют некоторые источники данных для создания этих основных объектов инвентаризации.

Nornir включает несколько плагинов инвентаризации, стандартным из которых является SimpleInventory, который использует и хранит все необходимые данные в трех YAML файлах — hosts, groups and defaults. Найти вы их можете в папке inventory. Эти файлы обрабатываются и используются для создания основных объектов инвентаризации. Эти файлы можно определенным образом изменять и создавать свои объекты инвентаризации. Кроме того, вы также можете создать свой собственный плагин для инвентаризации. Давайте рассмотрим их более детально. На самом нижнем уровне иерархии находится файл hosts.yaml, далее идет файл groups.yaml и затем уже defaults.yaml. Схематически это можно изобразить следующим образом:

Рис.3 Иерархическая структура Inventory.

Как видно из структуры на Рис.3 файлы взаимосвязаны между собой иерархически. Сначала в силу вступает все, что описано в файле hosts.yaml, если чего-то нет в hosts, то далее рассматривается groups.yaml, а затем уже defaults.yaml. Они все находятся в папке inventory:

Рис.4 Папка Inventory.

Файл Hosts

Файл hosts в основном представляет собой карту, где самым внешним ключом является имя хоста, а затем идет объект InventoryElement. Модель наследования используется для заполнения данных на уровне группы. Есть, одно ограничение, которому нужно следовать при описании групп; ключ групп должен обязательно быть в виде списка. Так выглядит часть файла hosts.yaml:

1 SW1:
2 port: 32779
3 hostname: 192.168.32.59
4 groups:
5 - nornir_labs
6 data:
7 tags:
8 - ios 15
9 connection_options:
10 netmiko:
11 extras:
12 device_type: 'cisco_ios_telnet

В файле hosts можно описать все характеристики оборудования, к которому мы хотим подключиться. Легко можно определить, что коммутатор SW1 имеет порт 32779, ip адрес — 192.168.32.59 и относится к группе хостов nornir_labs. Кроме того прописаны опции для подключения оборудования.

Файл Groups

Файл groups следует тем же правилам, что и файл hosts.

1 nornir_labs:
2 platform: 'cisco_ios'

В файле groups я прописал только платформу cisco ios, которая будет общей для других устройств в группе nornir_labs.

Файл Defaults

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

1 username: 
2 password:

Файл Config

Как я уже писал в прошлой статье, инициализировать Nornir можно с помощью конфигурационного файла, кода или их комбинации. В данной статье подробнее остановимся на конфигурационном файле config.yaml.

---
core:
num_workers: 20
inventory:
plugin: nornir.plugins.inventory.simple.SimpleInventory
options:
host_file: "inventory/hosts.yaml"
group_file: "inventory/groups.yaml"
defaults_file: "inventory/defaults.yaml"

Одним из многих преимуществ использования Nornir является то, что он будет распараллеливать выполнение задач с помощью num_workers, значение по-умолчанию которого равно 20. Если num_workers == 1, задача выполняется на всех хостах один за другим в простом цикле.

Опция inventory импортирует путь плагина для инвентаризации, где в опциях указано к каким именно файлам надо обращаться для получения информации об инвентаризации. Схематически можно показать следующим образом:

Рис 4. Взаимодействие config.yaml с hosts.yaml, groups.yaml и defaults.yaml

Подключение к оборудованию

Пришла пора подключения к оборудованию. Все это было описано в предыдущей статье, но на этот раз я хочу подключиться к 4-м коммутаторам и 10 маршрутизаторам, как показано в топологии на Рис.1. Воспользуемся следующими командами для подключения к оборудованию и отправки команды “show ip interface brief”.

Рис.5 Начальное подключение и выполнение задачи.

Разберем команды построчно. Первая строка импортируем InitNornir. Второй строкой создаем объект nornir(в данном случае nr), присваиваем ему значение InitNornir с параметрами конфигурационного файла, где config_file указывает путь к конфигурационному файлу.

Третьей и четвертой строкой импортируем плагины netmiko_send_command и print_result. Разберем их более детально. В строке 5 мы присваиваем к объекту results значение nr с методом run, который запустит указанную в аргументах задачу одновременно на хостах инвентаризации. Аргументом для run является метод netmiko_send_command, который запустит указанную в command_string команду ‘show ip int brief’ на удаленных устройствах.

В шестой строке функция ‘print_result’ позволяет получить и вывести на экран результат выполнения команды со всех устройств автоматически:

Рис.6 Краткий вывод результата на экран.

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

Ссылка на репозиторий .

Подписывайтесь на телеграм-канал — https://t.me/automate_net

--

--