def create_vpn_config(template1, template2, data_dict): """ The function that uses templates to generate a VPN configuration based on data in dictionary data. :param template1: name of the template file that creates the configuration for one side of the tunnel. :param template2: name of the template file that creates the configuration for second side of the tunnel. :param data_dict: dictionary with values to be substituted into templates :return: is tuple with two configurations (strings), which are obtained on the basis of templates. """ return generate_config(template1, data_dict), generate_config(template2, data_dict)
def configure_vpn(src_device_params, dst_device_params, src_template, dst_template, vpn_data_dict): tunnels1 = send_command(src_device_params, show='sh ip int bri | i Tun') tunnels2 = send_command(dst_device_params, show='sh ip int bri | i Tun') vpn_data_dict['tun_num'] = find_free_tunnel_id(tunnels1, tunnels2) result1 = send_command(src_device_params, config=generate_config(src_template, vpn_data_dict)) result2 = send_command(dst_device_params, config=generate_config(dst_template, vpn_data_dict)) return f'{result1}\n{result2}'
def configure_vpn(src_device_params, dst_device_params, src_template, dst_template, vpn_data_dict): """ The function uses templates to generate a VPN configuration based on data in vpn_data_dict. :param src_device_params: source dictionary with parameters of connection :param dst_device_params: destination dictionary with parameters of connection :param src_template: name of the template file which creates the configuration for one side of the tunnel. :param dst_template: name of the template file which creates the configuration for second side of the tunnel. :param vpn_data_dict: dictionary with values to be substituted into templates :return: output of commands from two routers """ return generate_config(template1, data_dict), generate_config(template2, data_dict)
def test_function_return_value(): correct_value_vlan = "vlan 10\n" "name Marketing" correct_value_access = ("interface Fa0/1\n" "switchport mode access\n" "switchport access vlan 10") correct_value_trunk = ("interface Fa0/23\n" "switchport trunk allowed vlan add 10\n" "interface Fa0/24\n" "switchport trunk allowed vlan add 10") template = "templates/add_vlan_to_switch.txt" data = { "vlan_id": 10, "name": "Marketing", "trunk": ["Fa0/23", "Fa0/24"], "access": ["Fa0/1"], } return_value = task_21_1.generate_config(template, data) return_value = strip_empty_lines(return_value) assert ( correct_value_vlan in return_value ), "В итоговой конфигурации не создан VLAN и/или не назначено имя VLAN" assert (correct_value_access in return_value ), "В итоговой конфигурации неправильная настройка access" assert (correct_value_trunk in return_value ), "В итоговой конфигурации неправильная настройка trunk"
def test_function_return_value(): correct_value_vlan = ('vlan 10\n' 'name Marketing') correct_value_access = ('interface Fa0/1\n' 'switchport mode access\n' 'switchport access vlan 10') correct_value_trunk = ('interface Fa0/23\n' 'switchport trunk allowed vlan add 10\n' 'interface Fa0/24\n' 'switchport trunk allowed vlan add 10') template = 'templates/add_vlan_to_switch.txt' data = { 'vlan_id': 10, 'name': 'Marketing', 'trunk': ['Fa0/23', 'Fa0/24'], 'access': ['Fa0/1'] } return_value = task_21_1.generate_config(template, data) return_value = strip_empty_lines(return_value) assert correct_value_vlan in return_value,\ "В итоговой конфигурации не создан VLAN и/или не назначено имя VLAN" assert correct_value_access in return_value,\ "В итоговой конфигурации неправильная настройка access" assert correct_value_trunk in return_value,\ "В итоговой конфигурации неправильная настройка trunk"
def test_function_return_value(): service_section = ( 'service timestamps debug datetime msec localtime show-timezone\n' 'service timestamps log datetime msec localtime show-timezone\n' 'service tcp-keepalives-in\n' 'service tcp-keepalives-out\n' 'service password-encryption\n') alias_section = ( 'alias exec top sh proc cpu sorted | excl 0.00%__0.00%__0.00%\n' 'alias exec diff sh archive config differences nvram:startup-config system:running-config\n' 'alias exec bri show ip int bri | exc unass\n' 'alias exec id show int desc\n') eem_section = ( 'event manager applet update-int-desc\n' ' event neighbor-discovery interface regexp .*Ethernet.* cdp add\n' ' action 1.0 cli command "enable"\n' ' action 2.0 cli command "config t"\n' ' action 3.0 cli command "interface $_nd_local_intf_name"\n' ' action 4.0 cli command "description To $_nd_cdp_entry_name $_nd_port_id"\n' ) template = 'templates/cisco_router_base.txt' data = {'hostname': 'R1'} return_value = task_21_1.generate_config(template, data) assert service_section in return_value, "В итоговой конфигурации нет команд service" assert alias_section in return_value, "В итоговой конфигурации нет команд alias" assert eem_section in return_value, "В итоговой конфигурации нет настройки event manager" assert data[ 'hostname'] in return_value, "В итоговой конфигурации нет hostname"
def test_function_return_value(): correct_return_value_router = ( "router ospf 10\n" "router-id 10.0.0.1\n" "auto-cost reference-bandwidth 20000\n" "network 10.255.0.1 0.0.0.0 area 0\n" "network 10.255.1.1 0.0.0.0 area 0\n" "network 10.255.2.1 0.0.0.0 area 0\n" "network 10.0.10.1 0.0.0.0 area 2\n" "network 10.0.20.1 0.0.0.0 area 2\n" "passive-interface Fa0/0.10\n" "passive-interface Fa0/0.20\n" ) correct_return_value_intf = ( "interface Fa0/1\n" "ip ospf hello-interval 1\n" "interface Fa0/1.100\n" "ip ospf hello-interval 1\n" "interface Fa0/1.200\n" "ip ospf hello-interval 1\n" ) template = "templates/ospf.txt" data = { "ospf_intf": [ {"area": 0, "ip": "10.255.0.1", "name": "Fa0/1", "passive": False}, {"area": 0, "ip": "10.255.1.1", "name": "Fa0/1.100", "passive": False}, {"area": 0, "ip": "10.255.2.1", "name": "Fa0/1.200", "passive": False}, {"area": 2, "ip": "10.0.10.1", "name": "Fa0/0.10", "passive": True}, {"area": 2, "ip": "10.0.20.1", "name": "Fa0/0.20", "passive": True}, ], "process": 10, "ref_bw": 20000, "router_id": "10.0.0.1", } return_value = task_21_1.generate_config(template, data) correct_lines_router = set(correct_return_value_router.splitlines()) correct_lines_interface = set(correct_return_value_intf.splitlines()) return_value = strip_empty_lines(return_value) return_lines = set(return_value.splitlines()) # проверяем что строки из correct_return_value_router содержатся в return_value assert correct_lines_router.issubset( return_lines ), "В итоговой конфигурации режима router ospf не все строки" # проверяем что строки из correct_return_value_intf содержатся в return_value assert correct_lines_interface.issubset( return_lines ), "В итоговой конфигурации интерфейсов не все строки"
def test_function_return_value(): correct_return_value = ('\n' 'hostname R3\n' '\n' 'interface Loopback0\n' ' ip address 10.0.0.3 255.255.255.255\n' '\n' 'vlan 10\n' ' name Marketing\n' 'vlan 20\n' ' name Voice\n' 'vlan 30\n' ' name Management\n' '\n' 'router ospf 1\n' ' router-id 10.0.0.3\n' ' auto-cost reference-bandwidth 10000\n' ' network 10.0.1.0 0.0.0.255 area 0\n' ' network 10.0.2.0 0.0.0.255 area 2\n' ' network 10.1.1.0 0.0.0.255 area 0\n') template = 'templates/for.txt' data = { 'id': 3, 'name': 'R3', 'vlans': { 10: 'Marketing', 20: 'Voice', 30: 'Management' }, 'ospf': [{ 'network': '10.0.1.0 0.0.0.255', 'area': 0 }, { 'network': '10.0.2.0 0.0.0.255', 'area': 2 }, { 'network': '10.1.1.0 0.0.0.255', 'area': 0 }] } return_value = task_21_1.generate_config(template, data) assert return_value != None, "Функция ничего не возвращает" assert type(return_value) == str, "Функция должна возвращать строку" assert strip_empty_lines(return_value) == strip_empty_lines(correct_return_value),\ "Функция возвращает неправильное значение"
def test_function_return_value(): correct_return_value_router = ( 'router ospf 10\n' 'router-id 10.0.0.1\n' 'auto-cost reference-bandwidth 20000\n' 'network 10.255.0.1 0.0.0.0 area 0\n' 'network 10.255.1.1 0.0.0.0 area 0\n' 'network 10.255.2.1 0.0.0.0 area 0\n' 'network 10.0.10.1 0.0.0.0 area 2\n' 'network 10.0.20.1 0.0.0.0 area 2\n' 'passive-interface Fa0/0.10\n' 'passive-interface Fa0/0.20\n' ) correct_return_value_intf = ( 'interface Fa0/1\n' 'ip ospf hello-interval 1\n' 'interface Fa0/1.100\n' 'ip ospf hello-interval 1\n' 'interface Fa0/1.200\n' 'ip ospf hello-interval 1\n' ) template = 'templates/ospf.txt' data = { 'ospf_intf': [ {'area': 0, 'ip': '10.255.0.1', 'name': 'Fa0/1', 'passive': False}, {'area': 0, 'ip': '10.255.1.1', 'name': 'Fa0/1.100', 'passive': False}, {'area': 0, 'ip': '10.255.2.1', 'name': 'Fa0/1.200', 'passive': False}, {'area': 2, 'ip': '10.0.10.1', 'name': 'Fa0/0.10', 'passive': True}, {'area': 2, 'ip': '10.0.20.1', 'name': 'Fa0/0.20', 'passive': True}], 'process': 10, 'ref_bw': 20000, 'router_id': '10.0.0.1' } return_value = task_21_1.generate_config(template, data) correct_lines_router = set(correct_return_value_router.splitlines()) correct_lines_interface = set(correct_return_value_intf.splitlines()) return_value = strip_empty_lines(return_value) return_lines = set(return_value.splitlines()) # проверяем что строки из correct_return_value_router содержатся в return_value assert correct_lines_router.issubset(return_lines),\ "В итоговой конфигурации режима router ospf не все строки" # проверяем что строки из correct_return_value_intf содержатся в return_value assert correct_lines_interface.issubset(return_lines),\ "В итоговой конфигурации интерфейсов не все строки"
def test_function_return_value(): correct_return_value = ( "\n" "hostname R3\n" "\n" "interface Loopback0\n" " ip address 10.0.0.3 255.255.255.255\n" "\n" "vlan 10\n" " name Marketing\n" "vlan 20\n" " name Voice\n" "vlan 30\n" " name Management\n" "\n" "router ospf 1\n" " router-id 10.0.0.3\n" " auto-cost reference-bandwidth 10000\n" " network 10.0.1.0 0.0.0.255 area 0\n" " network 10.0.2.0 0.0.0.255 area 2\n" " network 10.1.1.0 0.0.0.255 area 0\n" ) template = "templates/for.txt" data = { "id": 3, "name": "R3", "vlans": {10: "Marketing", 20: "Voice", 30: "Management"}, "ospf": [ {"network": "10.0.1.0 0.0.0.255", "area": 0}, {"network": "10.0.2.0 0.0.0.255", "area": 2}, {"network": "10.1.1.0 0.0.0.255", "area": 0}, ], } return_value = task_21_1.generate_config(template, data) assert return_value != None, "Функция ничего не возвращает" assert ( type(return_value) == str ), f"По заданию функция должна возвращать строку, а возвращает {type(return_value).__name__}" assert strip_empty_lines(return_value) == strip_empty_lines( correct_return_value ), "Функция возвращает неправильное значение"
* templates/cisco_base.txt - в нем должны быть все строки, кроме настройки alias и event manager. Имя хоста должно быть переменной hostname * templates/alias.txt - в этот шаблон перенести все alias * templates/eem_int_desc.txt - в этом шаблоне должен быть event manager applet В шаблонах templates/alias.txt и templates/eem_int_desc.txt переменных нет. Создать шаблон 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 из задания 21.1. Не копируйте код функции generate_config. В качестве данных, используйте информацию из файла data_files/router_info.yml ''' from task_21_1 import generate_config #dot't run on import if __name__ == "__main__": with open("data_files/router_info.yml") as src: vars_dict = safe_load(src) print(generate_config("templates/cisco_router_base.txt", vars_dict))
Для всех интерфейсов в списке 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 из задания 21.1. Не копируйте код функции generate_config. """ from jinja2 import Environment, FileSystemLoader import yaml from task_21_1 import generate_config if __name__ == "__main__": path = "/home/vagrant/my_repo/online-8-oleg-bosyuk/exercises/21_jinja2/" data_file = "data_files/ospf.yml" with open(path + data_file) as f: info = yaml.safe_load(f) print(generate_config('templates/ospf.txt', info))
* 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 из задания 21.1. Не копируйте код функции generate_config. ''' from task_21_1 import generate_config import yaml dic = yaml.load(open('data_files/ospf.yml'), Loader=yaml.FullLoader) print(generate_config('templates/ospf.txt', dic))
def main(): with open('data_files/router_info.yml', 'r', encoding='utf-8') as f: data_dict = yaml.safe_load(f) print(generate_config('templates/cisco_router_base.txt', data_dict))
В шаблоне должны поддерживаться возможности: * добавления 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 из задания 21.1. Не копируйте код функции generate_config. ''' from task_21_1 import generate_config import yaml dic = yaml.load(open('data_files/add_vlan_to_switch.yaml'), Loader=yaml.FullLoader) print(generate_config('templates/add_vlan_to_switch.txt', dic), end='')
Задание 21.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 из задания 21.1. Не копируйте код функции generate_config. ''' from task_21_1 import generate_config generate_config('templates/add_vlan_to_switch.txt', 'data_files/add_vlan_to_switch.yaml')
def main(): with open('data_files/add_vlan_to_switch.yaml', 'r', encoding='utf-8') as f: data_dict = yaml.safe_load(f) print(generate_config('templates/add_vlan_to_switch.txt', data_dict))
* 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 из задания 21.1. Не копируйте код функции generate_config. """ from task_21_1 import generate_config import yaml if __name__=="__main__": with open("data_files/ospf.yml") as f: data=yaml.safe_load(f) print(generate_config("templates/ospf.txt", data))
Создайте шаблон 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 из задания 21.1. Не копируйте код функции generate_config. ''' from task_21_1 import generate_config import yaml router = yaml.load(open('data_files/add_vlan_to_switch.yaml')) print(generate_config('add_vlan_to_switch.txt', router))
network {{ int.ip }} 0.0.0.0 area {{ int.area }} {% endfor %} {% for int in ospf_intf %} {% if int.passive == True: %} passive-interface {{ int.name }} {%endif%} {% endfor %} ! {% for int in ospf_intf %} {% if int.passive == False: %} interface {{ int.name }} ip ospf hello-interval 1 ! {%endif%} {% endfor %} """ from jinja2 import Environment, FileSystemLoader import yaml from task_21_1 import generate_config if __name__ == "__main__": path = "/home/vagrant/my_repo/online-8-oleg-bosyuk/exercises/21_jinja2/" data_file = "data_files/add_vlan_to_switch.yaml" with open(path + data_file) as f: info = yaml.safe_load(f) print(generate_config('templates/add_vlan_to_switch.txt', info))
# -*- coding: utf-8 -*- ''' Задание 21.2 На основе конфигурации config_r1.txt, создать шаблоны: * templates/cisco_base.txt - в нем должны быть все строки, кроме настройки alias и event manager. Имя хоста должно быть переменной hostname * templates/alias.txt - в этот шаблон перенести все alias * templates/eem_int_desc.txt - в этом шаблоне должен быть event manager applet В шаблонах templates/alias.txt и templates/eem_int_desc.txt переменных нет. Создать шаблон 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 из задания 21.1. Не копируйте код функции generate_config. В качестве данных, используйте информацию из файла data_files/router_info.yml ''' from task_21_1 import generate_config print(generate_config('cisco_router_base.txt', 'data_files/router_info.yml'))
Для всех интерфейсов в списке 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 из задания 21.1. Не копируйте код функции generate_config. ''' from task_21_1 import generate_config from pprint import pprint import yaml from sys import argv if __name__=="__main__": with open("data_files/ospf.yml") as yamlfile: data_dict=yaml.safe_load(yamlfile) template_file=argv[1] print(generate_config(template_file,data_dict))
* 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 из задания 21.1. Не копируйте код функции generate_config. ''' from task_21_1 import generate_config generate_config('templates/ospf.txt', 'data_files/ospf.yml')
Для всех интерфейсов в списке 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 из задания 21.1. Не копируйте код функции generate_config. """ import yaml from jinja2 import Environment, FileSystemLoader from pprint import pprint from task_21_1 import generate_config path='templates/ospf.txt' with open('data_files/ospf.yml', 'r') as f: data_dict=yaml.safe_load(f) print(generate_config(path, data_dict))
* интерфейсы, на которых нужно включить 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 из задания 21.1. Не копируйте код функции generate_config. ''' from task_21_1 import generate_config if __name__ == '__main__': print(generate_config('ospf.txt', 'data_files/ospf.yml'))
при необходимости добавить 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 из задания 21.1. Не копируйте код функции generate_config. ''' import yaml from task_21_1 import generate_config if __name__ == '__main__': vlan = yaml.safe_load(open('data_files/add_vlan_to_switch.yaml')) generate_config('templates/add_vlan_to_switch.txt', vlan)
Для всех интерфейсов в списке 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 из задания 21.1. Не копируйте код функции generate_config. ''' from jinja2 import Environment, FileSystemLoader import os, yaml, pprint from task_21_1 import generate_config if __name__ == '__main__': template = os.path.abspath("templates/ospf.txt") with open('data_files/ospf.yml') as f: data_dict = yaml.load(f) str_conf = generate_config(template, data_dict) print(str_conf)
В шаблоне должны поддерживаться возможности: * добавления 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 из задания 21.1. Не копируйте код функции generate_config. """ import yaml from task_21_1 import generate_config if __name__ == "__main__": with open("data_files/add_vlan_to_switch.yaml") as f: data = yaml.safe_load(f) print(generate_config("templates/add_vlan_to_switch.txt", data))
* templates/alias.txt - в этот шаблон перенести все alias * templates/eem_int_desc.txt - в этом шаблоне должен быть event manager applet В шаблонах templates/alias.txt и templates/eem_int_desc.txt переменных нет. Шаблоны надо создавать вручную, скопировав части конфига в соответствующие шаблоны. Создать шаблон 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 из задания 21.1. Не копируйте код функции generate_config. В качестве данных, используйте информацию из файла data_files/router_info.yml """ from jinja2 import Environment, FileSystemLoader import yaml import os from task_21_1 import generate_config #testing template1 = "templates/cisco_router_base.txt" with open('data_files/router_info.yml') as f: data_dict1 = yaml.safe_load(f) print(generate_config(template1, data_dict1))
Если интерфейс пассивный, для него должна быть добавлена строка: passive-interface x Для интерфейсов, которые не являются пассивными, в режиме конфигурации интерфейса, надо добавить строку: ip ospf hello-interval 1 Все команды должны быть в соответствующих режимах. Проверьте получившийся шаблон templates/ospf.txt, на данных в файле data_files/ospf.yml, с помощью функции generate_config из задания 21.1. Не копируйте код функции generate_config. """ from task_21_1 import generate_config import yaml import sys sys.path.insert( 0, 'C:/Users/snowowl/PycharmProjects/Natenka_python_tasks/21_jinja2/') with open( 'C:/Users/snowowl/PycharmProjects/Natenka_python_tasks/21_jinja2/data_files/ospf.yml' ) as f: var = yaml.safe_load(f) conf = generate_config('ospf.txt', var) with open('task_21_3_result.txt', 'w') as f: f.write(conf)