Основы netdev#
netdev - это модуль, который позволяет упростить использование asyncssh для сетевых устройств. Netdev использует asyncssh, но при этом создает интерфейс и методы, которые нужны для работы с сетевым оборудованием. Интерфейс работы похож на netmiko.
Установка netdev:
pip install netdev
Примечание
Текущая версия netdev 0.9.3 не поддерживает последние версии asyncssh.
Поддерживаемые платформы#
Поддерживаемые платформы:
Cisco IOS
Cisco IOS XE
Cisco IOS XR
Cisco ASA
Cisco NX-OS
HP Comware (like V1910 too)
Fujitsu Blade Switches
Mikrotik RouterOS
Arista EOS
Juniper JunOS
Aruba AOS 6.X
Aruba AOS 8.X
Terminal
Параметры подключения#
Основные параметры подключения:
host - IP-адрес или имя хоста
username - имя пользователя
password - пароль
secret (для Cisco IOS) - пароль на режим enable
device_type - тип устройства
Процесс подключения немного отличается в зависимости от того используется
асинхронный менеджер контекста или нет. При подключении без менеджера контекста,
сначала надо передать параметры netdev.create
, а затем вызвать метод connect
:
In [1]: import netdev
In [2]: r1 = {
...: 'device_type': 'cisco_ios',
...: 'host': '192.168.100.1',
...: 'username': 'cisco',
...: 'password': 'cisco',
...: 'secret': 'cisco',
...: }
In [3]: ssh = netdev.create(**r1)
In [4]: await ssh.connect()
После этого можно отправлять команды:
In [5]: ssh.base_prompt
Out[5]: 'R1'
In [6]: await ssh.check_enable_mode()
Out[6]: True
In [7]: await ssh.disconnect()
При использовании асинхронного менеджера контекста, open вызывать не надо:
In [9]: async with netdev.create(**r1) as ssh:
...: print(await ssh.check_enable_mode())
True
Отправка команд#
В netdev есть два основных метода для отправки команд:
send_command
- отправить одну show командуsend_config_set
- отправить список команд в конфигурационном режиме (если команда одна, надо отправлять список с одной строкой)
Метод send_command#
Метод send_command
позволяет отправить одну команду на устройство.
In [10]: await ssh.send_command("sh ip int br")
Out[10]: '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 unassigned YES NVRAM up up \nEthernet0/3 192.168.130.1 YES NVRAM up up \nLoopback11 11.1.1.1 YES manual up up \nLoopback99 unassigned YES unset up up \nLoopback100 10.1.1.100 YES manual up up \nLoopback200 10.2.2.2 YES manual up up \nTunnel0 10.255.1.1 YES manual up down \nTunnel1 unassigned YES unset up down \nTunnel9 unassigned YES unset up down '
Параметры команды:
ssh.send_command(
command_string,
pattern='',
re_flags=0,
strip_command=True,
strip_prompt=True,
)
Параметры strip_command и strip_prompt работают так же как в netmiko и при значении False (по умолчанию True), добавляют в вывод команду и приглашение:
In [11]: await ssh.send_command("sh clock")
Out[11]: '*05:54:20.671 UTC Thu Apr 8 2021'
In [12]: await ssh.send_command("sh clock", strip_command=False, strip_prompt=False)
Out[12]: 'sh clock\n*05:54:31.886 UTC Thu Apr 8 2021\nR1#'
Параметр pattern позволяет указывать какой строки ждать в выводе (нужно для команд, которые запрашивают подтверждение или ввод информации):
In [13]: await ssh.send_command("copy run start", pattern="Destination filename")
Out[13]: 'Destination filename [startup-config]? '
In [14]: await ssh.send_command("\n")
Out[14]: 'Building configuration...\n[OK]'
Метод send_config_set#
Метод send_config_set
позволяет отправить несколько команд конфигурационного
режима.
Пример использования:
In [16]: await ssh.send_config_set(["interface lo99", "ip address 10.99.9.9 255.25.255.255"])
Out[16]: 'conf t\nEnter configuration commands, one per line. End with CNTL/Z.\nR1(config)#interface lo99\nR1(config-if)#ip address 10.99.9.9 255.25.255.255\nBad mask 0xFF19FFFF for address 10.99.9.9\nR1(config-if)#end\nR1#'
Для отправки одной команды, ее надо передать как список с одной строкой:
In [17]: await ssh.send_config_set(["interface lo99"])
Out[17]: 'conf t\nEnter configuration commands, one per line. End with CNTL/Z.\nR1(config)#interface lo99\nR1(config-if)#end\nR1#'
Пример базового использования netdev#
import asyncio
import netdev
async def send_show(device, command):
async with netdev.create(**device) as ssh:
result = await ssh.send_command(command)
return result
if __name__ == "__main__":
r1 = {
"device_type": "cisco_ios",
"host": "192.168.100.1",
"username": "cisco",
"password": "cisco",
"secret": "cisco",
}
output = asyncio.run(send_show(r1, "show ip int br"))
print(output)