Сегодня транслирую вам материал Никиты Туркова про автоматизацию работы сетевого администратора с использованием пакетов Paramiko и Netmiko.
Автоматизация процесса обслуживания сетевых устройств невозможна без использования хтоя бы одного из языков программирования. Для 2021 года базовое знание Python это уже не преимущество кандидата (системного администратора, или сетевого инженера) , а одно из требований при трудоустройстве на работу. Одно из весомых преимуществ языка Python - большое количество сторонних библиотек для решения задач из различных областей. Естественно, энтузиасты и разработчики в рамках работы с сетью и сетевым оборудованием написали достаточное количество модулей. Перечислим те из них, которые поддерживают режим взаимодействия CLI:
• telnetlib - встроенная библиотека, она используется для обеспечения доступа к сетевому устройству и отправке команд по Telnet протоколу (не является безопасным).
• pexpect - внешняя библиотека работает для передачи данных по протоколам: ssh, telnet, sftp и др. Считается универсальным инструментом для передачи команд как в ОС, так и на сетевое оборудование. Логика работы основана на ожидании получения соответствующей строки от устройства и дальнейшей отправки команды.
• paramiko - внешняя библиотека, обеспечивающая организацию SSH-соединения. Работает в режиме клиента и сервера, соответственно в качестве передачи данных может использоваться только протокол SSH.
• netmiko - внешняя библиотека от сообщества сетевых инженеров и администраторов, была разработана специально для взаимодействия с сетевым оборудованием различных производителей (адаптация под сетевую ОС). Netmiko включает в себя paramiko, описанный раннее.
Наиболее популярные из них это Paramiko и Netmiko. Сегодня мы рассмотрим модуль Paramiko.
SSH и Paramiko.
Paramiko - это реализация протокола SSHv2 на Python. Paramiko предоставляет функциональность клиента и сервера. В рамках статьи будет рассматриваться лишь функциональность клиента, серверную часть возможно изучить самостоятельно.
Библиотека Paramiko не входит в список стандартных модулей для Python 3, поэтому ее требуется установить:
pip install paramiko
В Python3 есть отличная возможность тестировать ваши скрипты, отправляя одиночные команды, для этого достаточно лишь вызвать сам интерпретатор:
python3
Логика работы Paramiko:
1. создание клиента подключения SSH;
2. настройка клиента подключения SSH;
3. выполнение подключения SSH;
4. переход в интерактивный режим отправки команд для подключения SSH.
Создание клиента SSH:
In [1]: import paramiko
In [2]: client = paramiko.SSHClient()
In [3]: client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
In [4]: client.connect(hostname="10.10.10.1", username="admin", password="admin",look_for_keys=False, allow_agent=False)
In [5]: ssh = client.invoke_shell()
Комментарии к каждой из строк:
In [1]: импорт библиотеки Paramiko
In [2]: присваивание переменной client класса SSHClient cо всеми атрибутами.
In [3]: необязательная строка кода служит для указания какую политику использовать клиенту при подключение к неизвестному серверу в рамках SSH. В примере paramiko.AutoAddPolicy() автоматически добавляет новое имя хоста и ключ в локальный объект HostKeys.
In [4]: Метод connect выполняет подключение к SSH-серверу и аутентифицирует подключение. Его параметры: look_for_keys - режим аутентификации по ключам (True/False); allow_agent - режим подключения через локальный SSH-агент OC (True/False).
Метод send:
Отправка указанной строки и возврат количества переданных байт, если значение "0" - сессия закрыта и не удалось отправить команду.
In [6]: ssh.send("pwd\n")
"> 4
В нашем примере мы отправили команду "pwd" c целью узнать текущую директорию и получили ответ в виде 4 переданных байт.
Метод recv:
Получение данных с терминала устройства по построенному каналу SSH. Данные возвращаются в виде строки, вы указывается количество запрашиваемых данных в виде числа байт. Если возвращается число 0, канал SSH будет автоматически закрыт.
In [6]: ssh.recv(10)
'Last login'
Метод close:
Закрытие SSH - сессии
In [7]: ssh.close()
Скрипты с выводом конфигурации на экран.
Для закрепления рассмотрим скрипт по выводу "sh run" в Paramiko. После # или двойных кавычек будут следовать комментарии.
"Импорт различных библиотек для скрипта"
import paramiko
import time
import socket
from pprint import pprint
import re
"Функция по отправке команд "
def send_show_command(ip,
username,
password,
enable,
command,
max_bytes=60000,
short_pause=1,
long_pause=5,):
cl = paramiko.SSHClient()# создание класса SSH-клиента
cl.set_missing_host_key_policy(paramiko.AutoAddPolicy())
"Передача аргументов в метод connect"
hostname=ip,
username=username,
password=password,
look_for_keys=False,
allow_agent=False,
)
"Cоздание интерактивного подключения и вход в режим enable"
ssh.send("enable\n")
ssh.send(enable + "\n")
time.sleep(short_pause)
ssh.recv(max_bytes)
result = {}
"Отправка команд в цикле"
ssh.send(f"{command}\n")
ssh.settimeout(5)
output = ""
"Вывод за счет цикла всей информации из терминала"
try:
page = ssh.recv(max_bytes).decode("utf-8")
output += page
time.sleep(0.5)
except socket.timeout:
break
"Если требуется перейти в режим More"
ssh.send(" ")
output = re.sub(" +--More--| +\x08+ +\x08+", "\n", output)
result[command] = output
return result # возврат результата вывода
"Выполняется, если запускается непосредственно скрипт".
if __name__ == "__main__":
commands = ["sh run"]
result = send_show_command("192.168.100.1", "admin", "password", "cisco", commands)
pprint(result, width=120)
Конечно, для новичков в Python будет достаточно сложно разобраться со всеми строками кода, но по факту вам достаточно лишь изменить конструкцию после if __name__ == "__main__":
где вы будете вызывать фунцию send_show_command("192.168.100.1", "admin", "password", commands)
Произойдет соответственно передача аргументов: IP-адрес, логин, пароль, команды.
В следующей части рассмотрим библиотеку Netmiko.
Удачи.
No comments:
Post a Comment
А что вы думаете по этому поводу?