Задания#

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

Предупреждение

Начиная с раздела «4. Типы данных в Python» для проверки заданий есть автоматические тесты. Они помогают проверить все ли соответствует поставленной задаче, а также дают обратный отклик по тому, что не соответствует задаче. Как правило, после первого периода адаптации к тестам, становится проще делать задания с тестами. Проверка заданий выполняется с помощью утилиты pyneng. Подробнее о том как работать с утилитой pyneng.

Задание 20.1#

Создать функцию generate_config.

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

  • template - путь к файлу с шаблоном (например, «templates/for.txt»)

  • data_dict - словарь со значениями, которые надо подставить в шаблон

Функция должна возвращать строку с конфигурацией, которая была сгенерирована.

Проверить работу функции на шаблоне templates/for.txt и данных из файла data_files/for.yml.

import yaml


# так должен выглядеть вызов функции
if __name__ == "__main__":
    data_file = "data_files/for.yml"
    template_file = "templates/for.txt"
    with open(data_file) as f:
        data = yaml.safe_load(f)
    print(generate_config(template_file, data))

Задание 20.2#

Создать шаблон templates/cisco_router_base.txt. В шаблон templates/cisco_router_base.txt должно быть включено содержимое шаблонов:

  • templates/cisco_base.txt

  • templates/alias.txt

  • templates/eem_int_desc.txt

При этом, нельзя копировать текст шаблонов.

Проверьте шаблон templates/cisco_router_base.txt, с помощью функции generate_config из задания 20.1. Не копируйте код функции generate_config.

В качестве данных, используйте информацию из файла data_files/router_info.yml

Задание 20.3#

Создайте шаблон templates/ospf.txt на основе конфигурации OSPF в файле cisco_ospf.txt. Пример конфигурации дан, чтобы показать синтаксис.

Шаблон надо создавать вручную, скопировав части конфига в соответствующий шаблон.

Какие значения должны быть переменными:

  • номер процесса. Имя переменной - process

  • router-id. Имя переменной - router_id

  • reference-bandwidth. Имя переменной - ref_bw

  • интерфейсы, на которых нужно включить OSPF. Имя переменной - ospf_intf. На месте этой переменной ожидается список словарей с такими ключами:

    • name - имя интерфейса, вида Fa0/1, Vlan10, Gi0/0

    • ip - IP-адрес интерфейса, вида 10.0.1.1

    • area - номер зоны

    • passive - является ли интерфейс пассивным. Допустимые значения: True или False

Для всех интерфейсов в списке ospf_intf, надо сгенерировать строки:

network x.x.x.x 0.0.0.0 area x

Если интерфейс пассивный, для него должна быть добавлена строка:

passive-interface x

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

ip ospf hello-interval 1

Все команды должны быть в соответствующих режимах.

Проверьте получившийся шаблон templates/ospf.txt, на данных в файле data_files/ospf.yml, с помощью функции generate_config из задания 20.1. Не копируйте код функции generate_config.

В результате должна получиться конфигурация такого вида (команды в режиме router ospf не обязательно должны быть в таком порядке, главное чтобы они были в нужном режиме):

router ospf 10
 router-id 10.0.0.1
 auto-cost reference-bandwidth 20000
 network 10.255.0.1 0.0.0.0 area 0
 network 10.255.1.1 0.0.0.0 area 0
 network 10.255.2.1 0.0.0.0 area 0
 network 10.0.10.1 0.0.0.0 area 2
 network 10.0.20.1 0.0.0.0 area 2
 passive-interface Fa0/0.10
 passive-interface Fa0/0.20
interface Fa0/1
 ip ospf hello-interval 1
interface Fa0/1.100
 ip ospf hello-interval 1
interface Fa0/1.200
 ip ospf hello-interval 1

Задание 20.4#

Создайте шаблон templates/add_vlan_to_switch.txt, который будет использоваться при необходимости добавить VLAN на коммутатор.

В шаблоне должны поддерживаться возможности:

  • добавления VLAN и имени VLAN

  • добавления VLAN как access, на указанном интерфейсе

  • добавления VLAN в список разрешенных, на указанные транки

Если VLAN необходимо добавить как access, надо настроить и режим интерфейса и добавить его в VLAN:

interface Gi0/1
 switchport mode access
 switchport access vlan 5

Для транков, необходимо только добавить VLAN в список разрешенных:

interface Gi0/10
 switchport trunk allowed vlan add 5

Имена переменных надо выбрать на основании примера данных, в файле data_files/add_vlan_to_switch.yaml.

Проверьте шаблон templates/add_vlan_to_switch.txt на данных в файле data_files/add_vlan_to_switch.yaml, с помощью функции generate_config из задания 20.1. Не копируйте код функции generate_config.

Задание 20.5#

Создать шаблоны templates/gre_ipsec_vpn_1.txt и templates/gre_ipsec_vpn_2.txt, которые генерируют конфигурацию IPsec over GRE между двумя маршрутизаторами.

Шаблон templates/gre_ipsec_vpn_1.txt создает конфигурацию для одной стороны туннеля, а templates/gre_ipsec_vpn_2.txt - для второй.

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

Создать функцию create_vpn_config, которая использует эти шаблоны для генерации конфигурации VPN на основе данных в словаре data.

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

  • template1 - имя файла с шаблоном, который создает конфигурацию для одной строны туннеля

  • template2 - имя файла с шаблоном, который создает конфигурацию для второй строны туннеля

  • data_dict - словарь со значениями, которые надо подставить в шаблоны

Функция должна возвращать кортеж с двумя конфигурациямя (строки), которые получены на основе шаблонов.

Примеры конфигураций VPN, которые должна возвращать функция create_vpn_config в файлах cisco_vpn_1.txt и cisco_vpn_2.txt.

data = {
    'tun_num': 10,
    'wan_ip_1': '192.168.100.1',
    'wan_ip_2': '192.168.100.2',
    'tun_ip_1': '10.0.1.1 255.255.255.252',
    'tun_ip_2': '10.0.1.2 255.255.255.252'
}

Задание 20.5a#

Создать функцию configure_vpn, которая использует шаблоны из задания 20.5 для настройки VPN на маршрутизаторах на основе данных в словаре data.

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

  • src_device_params - словарь с параметрами подключения к устройству

  • dst_device_params - словарь с параметрами подключения к устройству

  • src_template - имя файла с шаблоном, который создает конфигурацию для одной строны туннеля

  • dst_template - имя файла с шаблоном, который создает конфигурацию для второй строны туннеля

  • vpn_data_dict - словарь со значениями, которые надо подставить в шаблоны

Функция должна настроить VPN на основе шаблонов и данных на каждом устройстве с помощью netmiko. Функция возвращает вывод с набором команд с двух марушртизаторов (вывод, которые возвращает метод netmiko send_config_set).

При этом, в словаре data не указан номер интерфейса Tunnel, который надо использовать. Номер надо определить самостоятельно на основе информации с оборудования. Если на маршрутизаторе нет интерфейсов Tunnel, взять номер 0, если есть взять ближайший свободный номер, но одинаковый для двух маршрутизаторов.

Например, если на маршрутизаторе src такие интерфейсы: Tunnel1, Tunnel4. А на маршрутизаторе dest такие: Tunnel2, Tunnel3, Tunnel8. Первый свободный номер одинаковый для двух маршрутизаторов будет 5. И надо будет настроить интерфейс Tunnel 5.

Примечание

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

data = {
    'tun_num': None,
    'wan_ip_1': '192.168.100.1',
    'wan_ip_2': '192.168.100.2',
    'tun_ip_1': '10.0.1.1 255.255.255.252',
    'tun_ip_2': '10.0.1.2 255.255.255.252'
}