Главная

Thursday, 23 September 2021

Автоматизация сетевых задач - Paramiko.

Всем привет.

Сегодня транслирую вам материал Никиты Туркова про автоматизацию работы сетевого администратора  с использованием пакетов 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

А что вы думаете по этому поводу?