- en
- Language: ru
- Documentation version: latest
Задания
Предупреждение
Начиная с раздела «9. Функции» для проверки заданий есть автоматические тесты. Они помогают проверить все ли соответствует поставленной задаче, а также дают обратный отклик по тому, что не соответствует задаче. Как правило, после первого периода адаптации к тестам, становится проще делать задания с тестами.
Задание 24.1
Создать класс CiscoSSH, который наследует класс BaseSSH из файла base_connect_class.py.
Создать метод __init__ в классе CiscoSSH таким образом, чтобы после подключения по SSH выполнялся переход в режим enable.
Для этого в методе __init__ должен сначала вызываться метод __init__ класса ConnectSSH, а затем выполняться переход в режим enable.
In [2]: from task_24_1 import CiscoSSH
In [3]: r1 = CiscoSSH(**device_params)
In [4]: r1.send_show_command('sh ip int br')
Out[4]: 'Interface IP-Address OK? Method Status Protocol\nEthernet0/0 192.168.100.1 YES NVRAM up up \nEthernet0/1 192.168.200.1 YES NVRAM up up \nEthernet0/2 190.16.200.1 YES NVRAM up up \nEthernet0/3 192.168.230.1 YES NVRAM up up \nEthernet0/3.100 10.100.0.1 YES NVRAM up up \nEthernet0/3.200 10.200.0.1 YES NVRAM up up \nEthernet0/3.300 10.30.0.1 YES NVRAM up up '
Задание 24.1a
Дополнить класс CiscoSSH из задания 24.1.
Перед подключением по SSH необходимо проверить если ли в словаре с параметрами подключения такие параметры: username, password, secret. Если нет, запросить их у пользователя, а затем выполнять подключение. Если параметры есть, сразу выполнить подключение.
In [1]: from task_24_1a import CiscoSSH
In [2]: device_params = {
...: 'device_type': 'cisco_ios',
...: 'host': '192.168.100.1',
...: }
In [3]: r1 = CiscoSSH(**device_params)
Введите имя пользователя: cisco
Введите пароль: cisco
Введите пароль для режима enable: cisco
In [4]: r1.send_show_command('sh ip int br')
Out[4]: 'Interface IP-Address OK? Method Status Protocol\nEthernet0/0 192.168.100.1 YES NVRAM up up \nEthernet0/1 192.168.200.1 YES NVRAM up up \nEthernet0/2 190.16.200.1 YES NVRAM up up \nEthernet0/3 192.168.230.1 YES NVRAM up up \nEthernet0/3.100 10.100.0.1 YES NVRAM up up \nEthernet0/3.200 10.200.0.1 YES NVRAM up up \nEthernet0/3.300 10.30.0.1 YES NVRAM up up '
Задание 24.2
Создать класс MyNetmiko, который наследует класс CiscoIosSSH из netmiko.
Переписать метод __init__ в классе MyNetmiko таким образом, чтобы после подключения по SSH выполнялся переход в режим enable.
Для этого в методе __init__ должен сначала вызываться метод __init__ класса CiscoIosBase, а затем выполнялся переход в режим enable.
Проверить, что в классе MyNetmiko доступны методы send_command и send_config_set
In [2]: from task_24_2 import MyNetmiko
In [3]: r1 = MyNetmiko(**device_params)
In [4]: r1.send_command('sh ip int br')
Out[4]: 'Interface IP-Address OK? Method Status Protocol\nEthernet0/0 192.168.100.1 YES NVRAM up up \nEthernet0/1 192.168.200.1 YES NVRAM up up \nEthernet0/2 190.16.200.1 YES NVRAM up up \nEthernet0/3 192.168.230.1 YES NVRAM up up \nEthernet0/3.100 10.100.0.1 YES NVRAM up up \nEthernet0/3.200 10.200.0.1 YES NVRAM up up \nEthernet0/3.300 10.30.0.1 YES NVRAM up up '
Импорт класса CiscoIosSSH:
from netmiko.cisco.cisco_ios import CiscoIosSSH
device_params = {
"device_type": "cisco_ios",
"ip": "192.168.100.1",
"username": "cisco",
"password": "cisco",
"secret": "cisco",
}
Задание 24.2a
Дополнить класс MyNetmiko из задания 24.2.
Добавить метод _check_error_in_command, который выполняет проверку на такие ошибки:
Invalid input detected
Incomplete command
Ambiguous command
Метод ожидает как аргумент команду и вывод команды. Если в выводе не обнаружена ошибка, метод ничего не возвращает. Если в выводе найдена ошибка, метод генерирует исключение ErrorInCommand с сообщениеем о том какая ошибка была обнаружена, на каком устройстве и в какой команде.
Переписать метод send_command netmiko, добавив в него проверку на ошибки.
In [2]: from task_24_2a import MyNetmiko
In [3]: r1 = MyNetmiko(**device_params)
In [4]: r1.send_command('sh ip int br')
Out[4]: 'Interface IP-Address OK? Method Status Protocol\nEthernet0/0 192.168.100.1 YES NVRAM up up \nEthernet0/1 192.168.200.1 YES NVRAM up up \nEthernet0/2 190.16.200.1 YES NVRAM up up \nEthernet0/3 192.168.230.1 YES NVRAM up up \nEthernet0/3.100 10.100.0.1 YES NVRAM up up \nEthernet0/3.200 10.200.0.1 YES NVRAM up up \nEthernet0/3.300 10.30.0.1 YES NVRAM up up '
In [5]: r1.send_command('sh ip br')
---------------------------------------------------------------------------
ErrorInCommand Traceback (most recent call last)
<ipython-input-2-1c60b31812fd> in <module>()
----> 1 r1.send_command('sh ip br')
...
ErrorInCommand: При выполнении команды "sh ip br" на устройстве 192.168.100.1 возникла ошибка "Invalid input detected at '^' marker."
Исключение ErrorInCommand:
class ErrorInCommand(Exception):
"""
Исключение генерируется, если при выполнении команды на оборудовании, возникла ошибка.
"""
Задание 24.2b
Скопировать класс MyNetmiko из задания 24.2a.
Дополнить функционал метода send_config_set netmiko и добавить в него проверку на ошибки с помощью метода _check_error_in_command.
Метод send_config_set должен отправлять команды по одной и проверять каждую на ошибки. Если при выполнении команд не обнаружены ошибки, метод send_config_set возвращает вывод команд.
In [2]: from task_24_2b import MyNetmiko
In [3]: r1 = MyNetmiko(**device_params)
In [4]: r1.send_config_set('lo')
---------------------------------------------------------------------------
ErrorInCommand Traceback (most recent call last)
<ipython-input-2-8e491f78b235> in <module>()
----> 1 r1.send_config_set('lo')
...
ErrorInCommand: При выполнении команды "lo" на устройстве 192.168.100.1 возникла ошибка "Incomplete command."
Задание 24.2c
Проверить, что метод send_command класса MyNetmiko из задания 24.2b, принимает дополнительные аргументы (как в netmiko), кроме команды.
Если возникает ошибка, переделать метод таким образом, чтобы он принимал любые аргументы, которые поддерживает netmiko.
In [2]: from task_24_2c import MyNetmiko
In [3]: r1 = MyNetmiko(**device_params)
In [4]: r1.send_command('sh ip int br', strip_command=False)
Out[4]: 'sh ip int br\nInterface IP-Address OK? Method Status Protocol\nEthernet0/0 192.168.100.1 YES NVRAM up up \nEthernet0/1 192.168.200.1 YES NVRAM up up \nEthernet0/2 190.16.200.1 YES NVRAM up up \nEthernet0/3 192.168.230.1 YES NVRAM up up \nEthernet0/3.100 10.100.0.1 YES NVRAM up up \nEthernet0/3.200 10.200.0.1 YES NVRAM up up \nEthernet0/3.300 10.30.0.1 YES NVRAM up up '
In [5]: r1.send_command('sh ip int br', strip_command=True)
Out[5]: 'Interface IP-Address OK? Method Status Protocol\nEthernet0/0 192.168.100.1 YES NVRAM up up \nEthernet0/1 192.168.200.1 YES NVRAM up up \nEthernet0/2 190.16.200.1 YES NVRAM up up \nEthernet0/3 192.168.230.1 YES NVRAM up up \nEthernet0/3.100 10.100.0.1 YES NVRAM up up \nEthernet0/3.200 10.200.0.1 YES NVRAM up up \nEthernet0/3.300 10.30.0.1 YES NVRAM up up '
Задание 24.2d
Скопировать класс MyNetmiko из задания 24.2c или задания 24.2b.
Добавить параметр ignore_errors в метод send_config_set. Если передано истинное значение, не надо выполнять проверку на ошибки и метод должен работать точно так же как метод send_config_set в netmiko. Если значение ложное, ошибки должны проверяться.
По умолчанию ошибки должны игнорироваться.
In [2]: from task_24_2d import MyNetmiko
In [3]: r1 = MyNetmiko(**device_params)
In [6]: r1.send_config_set('lo')
Out[6]: 'config term\nEnter configuration commands, one per line. End with CNTL/Z.\nR1(config)#lo\n% Incomplete command.\n\nR1(config)#end\nR1#'
In [7]: r1.send_config_set('lo', ignore_errors=True)
Out[7]: 'config term\nEnter configuration commands, one per line. End with CNTL/Z.\nR1(config)#lo\n% Incomplete command.\n\nR1(config)#end\nR1#'
In [8]: r1.send_config_set('lo', ignore_errors=False)
---------------------------------------------------------------------------
ErrorInCommand Traceback (most recent call last)
<ipython-input-8-704f2e8d1886> in <module>()
----> 1 r1.send_config_set('lo', ignore_errors=False)
...
ErrorInCommand: При выполнении команды "lo" на устройстве 192.168.100.1 возникла ошибка "Incomplete command."