Книга: PyNEng
Назад: Дополнительные материалы
Дальше: VI. Ansible

Задания

Задания

Все задания и вспомогательные файлы можно скачать в . Если в заданиях раздела есть задания с буквами (например, 5.2a), то лучше выполнить сначала задания без букв, а затем с буквами. Задания с буквами, как правило, немного сложнее заданий без букв и развивают или усложняют идею в соответствующем задании без буквы.

Например, в разделе есть задания 5.1, 5.2, 5.2a, 5.2b, 5.3, 5.3a. Сначала лучше выполнить задания 5.1, 5.2, 5.3, а затем 5.2a, 5.2b, 5.3a

Если задания с буквами получается сделать сразу, лучше делать их по порядку.

Задание 22.1

Переделать пример, который использовался в разделе TextFSM, в функцию.

Функция должна называться parse_output. Параметры функции:

  • template - шаблон TextFSM (это должно быть имя файла, в котором находится шаблон)
  • output - вывод соответствующей команды show (строка)

Функция должна возвращать список:

  • первый элемент - это список с названиями столбцов (в примере ниже, находится в переменной header)
  • остальные элементы это списки, в которых находятся результаты обработки вывода (в примере ниже, находится в переменной result)

Проверить работу функции на каком-то из примеров раздела.

Пример из раздела:

import sys import textfsm from tabulate import tabulate  template = sys.argv[1] output_file = sys.argv[2]  with open(template) as f, open(output_file) as output:     re_table = textfsm.TextFSM(f)     header = re_table.header     result = re_table.ParseText(output.read())     print(result)     print(tabulate(result, headers=header)) 

Задание 22.1a

Переделать функцию parse_output из задания 22.1 таким образом, чтобы, вместо списка списков, она возвращала один список словарей:

  • ключи - названия столбцов,
  • значения, соответствующие значения в столбцах.

То есть, для каждой строки будет один словарь в списке.

Задание 22.2

В этом задании нужно использовать функцию parse_output из задания 22.1. Она используется для того, чтобы получить структурированный вывод в результате обработки вывода команды.

Полученный вывод нужно записать в CSV формате.

Для записи вывода в CSV, нужно создать функцию list_to_csv, которая ожидает как аргументы:

  • список:
    • первый элемент - это список с названиями заголовков
    • остальные элементы это списки, в котором находятся результаты обработки вывода
  • имя файла, в который нужно записать данные в CSV формате

Проверить работу функции на примере обработки команды sh ip int br (шаблон и вывод есть в разделе).

Задание 22.3

Сделать шаблон TextFSM для обработки вывода sh ip dhcp snooping binding. Вывод команды находится в файле output/sh_ip_dhcp_snooping.txt.

Шаблон должен обрабатывать и возвращать значения таких столбцов:

  • MacAddress
  • IpAddress
  • VLAN
  • Interface

Проверить работу шаблона с помощью функции из задания 22.1.

Задание 22.4

На основе примера из раздела сделать функцию parse_command_dynamic.

Параметры функции:

  • словарь атрибутов, в котором находятся такие пары ключ: значение:
    • 'Command': команда
    • 'Vendor': вендор (обратите внимание, что файл index отличается от примера, который использовался в разделе, поэтому Вам нужно подставить тут правильное значение)
  • имя файла, где хранится соответствие между командами и шаблонами (строка)
    • значение по умолчанию аргумента - index
  • каталог, где хранятся шаблоны и файл с соответствиями (строка)
    • значение по умолчанию аргумента - templates
  • вывод команды (строка)

Функция должна возвращать список словарей с результатами обработки вывода команды (как в задании 22.1a):

  • ключи - названия столбцов
  • значения - соответствующие значения в столбцах

Проверить работу функции на примере вывода команды sh ip int br.

Пример из раздела:

import clitable  output_sh_ip_route_ospf = open('output/sh_ip_route_ospf.txt').read()  cli_table = clitable.CliTable('index', 'templates') attributes = {'Command': 'show ip route ospf', 'Vendor': 'Cisco'}  cli_table.ParseCmd(output_sh_ip_route_ospf, attributes)  print('CLI Table output:\n', cli_table) print('Formatted Table:\n', cli_table.FormattedTable())  data_rows = [list(row) for row in cli_table] header = list(cli_table.header)  print(header) for row in data_rows:     print(row) 

Задание 22.4a

Переделать функцию из задания 22.4:

  • добавить аргумент show_output, который контролирует будет ли выводиться результат обработки команды на стандартный поток вывода
    • по умолчанию False, что значит результат не будет выводиться
  • результат должен отображаться с помощью FormattedTable (пример есть в разделе)

Задание 22.5

В этом задании соединяется функциональность TextFSM и подключение к оборудованию.

Задача такая:

  • подключиться к оборудованию
  • выполнить команду show
  • полученный вывод передавать на обработку TextFSM
  • вернуть результат обработки

Для этого, воспользуемся функциями, которые были созданы ранее:

  • функцией send_show_command из упражнения 19.1
  • функцией parse_command_dynamic из упражнения 22.4

В этом упражнении нужно создать функцию send_and_parse_command:

  • функция должна использовать внутри себя функции parse_command_dynamic и send_show_command.
  • какие аргументы должны быть у функции send_and_parse_command, нужно решить самостоятельно
    • но, надо иметь в виду, какие аргументы ожидают две готовые функции, которые мы используем
  • функция send_and_parse_command должна возвращать:
    • функция send_show_command возвращает словарь с результатами выполнения команды:
      • ключ - IP устройства
      • значение - результат выполнения команды
    • затем, нужно отправить полученный вывод на обработку функции parse_command_dynamic
    • в результате, должен получиться словарь, в котором:
      • ключ - IP устройства
      • значение - список словарей (то есть, тот вывод, который был получен из функции parse_command_dynamic)

Для функции send_show_command создан файл devices.yaml, в котором находятся параметры подключения к устройствам.

Проверить работу функции send_and_parse_command на команде sh ip int br.

Задание 22.6

Это задание похоже на задание 22.5, но в этом задании подключения надо выполнять параллельно с помощью потоков. Для параллельного подключения использовать модуль concurrent.futures.

В этом упражнении нужно создать функцию send_and_parse_command_parallel:

  • она должна использовать внутри себя функцию send_and_parse_command
  • какие аргументы должны быть у функции send_and_parse_command_parallel, нужно решить самостоятельно
  • функция send_and_parse_command_parallel должна возвращать словарь, в котором:
    • ключ - IP устройства
    • значение - список словарей

Проверить работу функции send_and_parse_command_parallel на команде sh ip int br.

import yaml  test_command = "sh ip int br" devices = yaml.load(open('devices.yaml')) 
Назад: Дополнительные материалы
Дальше: VI. Ansible