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

К сожалению, в настоящее время не все из нас смогли заменить наше «устаревшее» сетевое оборудование на все новые сетевые продукты, которые поставляются с API, потоковой телеметрией и т. д., которые помогают нам программно взаимодействовать с нашей сетью.

Есть несколько стратегий синтаксического анализа, которые мы рассмотрим более подробно вместе с методами их использования:

  • Шаблоны NTC с использованием TextFSM
  • Genie Parser от Cisco PyATS
  • Ansible Native Parser
  • Плагин настраиваемого фильтра Ansible
  • NAPALM  геттеры
  • Анализатор текста шаблона (TTP)

В этой серии статей мы подробнее рассмотрим, «как» анализировать неструктурированные данные.

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

Зачем мне нужны структурированные данные из моего интерфейса командной строки?

Синтаксический анализ — это акт перевода языка (неструктурированные данные, которые люди могут легко прочитать) на другой язык (структурированные данные, которые компьютер может легко прочитать). Ниже приведен пример того, как мы выполняем некоторую форму проверки неструктурированных данных:

>>> unstructured_data = """
... Capability codes:
...     (R) Router, (B) Bridge, (T) Telephone, (C) DOCSIS Cable Device
...     (W) WLAN Access Point, (P) Repeater, (S) Station, (O) Other
... 
... Device ID           Local Intf     Hold-time  Capability      Port ID
... S2                  Fa0/13         120        B               Gi0/13
... Cisco-switch-1      Gi1/0/7        120                        Gi0/1
... Juniper-switch1     Gi2/0/1        120        B,R             666
... Juniper-switch1     Gi1/0/1        120        B,R             531
... 
... Total entries displayed: 4
"""
>>> neighbors = [
...     "S2",
...     "Cisco-switch-1",
...     "Juniper-switch1",
]
>>> for neighbor in neighbors:
...     if neighbor in unstructured_data:
...         print(f"{neighbor} on router")
S2 on router
Cisco-switch-1 on router
Juniper-switch1 on router
>>> neighbors = [
...     {"name": "S2", "intf": "Fa0/13"},
...     {"name": "Cisco-switch-1", "intf": "Gi1/0/7"},
...     {"name": "Juniper-switch1", "intf": "Gi2/0/1"},
...     {"name": "Juniper-switch1", "intf": "Gi1/0/1"},
... ]
>>> for neighbor in neighbors:
...     for cfg_line in unstructured_data.splitlines():
...         if neighbor["name"] in cfg_line and neighbor["intf"] in cfg_line:
...             print(f"Neighbor {neighbor["name"]} is seen on {neighbor["intf"]}")
Neighbor S2 is seen on Fa0/13
Neighbor Cisco-switch-1 is seen on Gi1/0/7
Neighbor Juniper-switch1 is seen on Gi2/0/1
Neighbor Juniper-switch1 is seen on Gi1/0/1

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

Вот краткий список, в котором представлены несколько вариантов использования того, почему вы можете захотеть превратить неструктурированные данные в структурированные.

  • Возможность хранить структурированные данные в базе данных временных рядов (TSDB) для телеметрии и аналитики, которые могут помочь вам быстро определить основную причину проблемы, с которой сталкивается сеть.
  • Выполните определенные действия в зависимости от операционных данных, полученных с устройства, например, отключение интерфейса или включение однорангового узла BGP.
  • Убедитесь, что каждое устройство совместимо с операционной системой, например, определите, что каждое устройство видит правильных соседей на каждом из своих интерфейсов.

Резюме

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

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