Моя Подруга Нетмико. Часть 2. Три Улучшения Скрипта Python

Продолжаю возиться с рутинной автоматизацией в сети коммутаторов Huawei. На этот раз исследования, которые позволили нам сократить код в 3 раза, а именно: хосты и команды были вынесены в отдельные файлы, пароль и имя пользователя больше не хранятся в открытом виде.

Есть демонстрация запустить скрипт.

Моя подруга Нетмико.
</p><p>
 Часть 2. Три улучшения скрипта Python

Визуально я воспринимаю вещи лучше, поэтому задачу по оптимизации скрипта я представил в графическом виде (см.

ниже), а именно, в ней отразились три основные задачи:

  1. Используйте файл инвентаризации, в котором перечислены IP-адреса всех сетевых устройств, а не создайте словарь для каждого из них.

  2. Перенесите команды конфигурации в отдельный файл и вызывайте его с помощью функции так же, как и файл инвентаризации.

  3. Избавьтесь от хранения пароля и имени пользователя в скрипте.

Также я удалил команды проверки (их, конечно, можно оставить, и они будут работать из файла конфигурации, но для этой задачи они не нужны).



Моя подруга Нетмико.
</p><p>
 Часть 2. Три улучшения скрипта Python

В комментарии к предыдущему посту «Мой друг Нетмико» был вопрос от пользователя андерс_и о том, насколько можно масштабировать скрипт:

Моя подруга Нетмико.
</p><p>
 Часть 2. Три улучшения скрипта Python

Затем я использовал 4 виртуальных процессора Huawei CloudEngine в eNSP. В этот раз я постарался расширить их число настолько, насколько хватит мощности Huawei MateBook X Pro 2021. И нам удалось расширить его до 8. 9-й отказался запускаться, занятость 16гб оперативки составила 80%.

Обновленная топология выглядит следующим образом:

Моя подруга Нетмико.
</p><p>
 Часть 2. Три улучшения скрипта Python



1. Создайте файл конфигурации.

Я предпочитаю редактор Nano (некоторые предпочитают Vim): nano switch_file_config В файле пишу все команды из предыдущего примера (команды могут быть любые в зависимости от потребностей) без пробелов/отступов.

Важный укажите команду возвращаться Последняя линия.

Насколько я понимаю, его нужно писать вручную только при использовании файла конфигурации — при написании команд в самой скрипке модуль Netmiko автоматически применяет ее и завершает SSH-соединение.

Без возвращаться скрипт не будет работать.

Список команд вынесен в отдельный файл:

Моя подруга Нетмико.
</p><p>
 Часть 2. Три улучшения скрипта Python

Теперь весь предыдущий код:

  
  
  
  
  
  
  
  
  
   

for n in range (300,302): print ("Creating VLAN " + str(n)) config_commands = [ 'vlan ' + str(n), 'desc NETMIKO_VLAN ' + str(n), 'Commit' ] output = ssh_connect.send_config_set(config_commands) output = ssh_connect.send_config_set( [ 'interface range GE 1/0/9 GE 1/0/10', 'port trunk allow-pass vlan 300 301', 'commit' ] )

Я сокращаю это до:

with open('switch_file_config') as f: config_lines = f.read().

splitlines() print (config_lines)

и я меняю строку:

output = ssh_connect.send_config_set(config_lines)

Функция Python открыть открывает указанный файл, читает его, разбивая на строки (форматирование) f.read().

splitlines() и отображает его на экране печать (config_lines).

Модуль Нетмико send_config_set теперь получу доступ к этому файлу (конфигурационные_линии) , используя команды из него.



2. Создайте файл инвентаризации с IP-адресами коммутаторов:

Я начинаю с создания того же файла в редакторе Nano: нано-мипереключатели Этот файл будет содержать список IP-адресов коммутатора:

Моя подруга Нетмико.
</p><p>
 Часть 2. Три улучшения скрипта Python

Здесь главное следить, чтобы не оставалось пробелов.

Сохраняю командой Ctrl+X. Для небольшого теста я создал файл Python под названием openfile.py. Я написал в нем простой скрипт, который будет открывать файл с IP-адресами и отображать их на экране:

f = open ('myswitches') for IP in f: print (IP)

Запустил:

Моя подруга Нетмико.
</p><p>
 Часть 2. Три улучшения скрипта Python

Как видите, первая строка осталась пустой, а это значит, что для Python она будет выглядеть как [` ',].

Если вы попытаетесь запустить такой файл, Python выдаст ошибку, что не удалось связаться с адресом назначения.

Поэтому лучше не допускать пустых строк.

Я настроил в eNSP еще 4 CE-коммутатора, присвоив им IP-адреса и настроив SSH-соединение:

Моя подруга Нетмико.
</p><p>
 Часть 2. Три улучшения скрипта Python

Теперь я сокращу весь предыдущий код:

CE_1_BORDER = { 'device_type': 'huawei', 'ip': '7.7.7.1', 'username': 'vasyo1', 'password': '@ghjcnjnF358986' } CE_2 = { 'device_type': 'huawei', 'ip': '7.7.7.2', 'username': 'vasyo1', 'password': '@ghjcnjnF358986' } CE_3 = { 'device_type': 'huawei', 'ip': '7.7.7.3', 'username': 'vasyo1', 'password': '@ghjcnjnF358986' } CE_4 = { 'device_type': 'huawei', 'ip': '7.7.7.4', 'username': 'vasyo1', 'password': '@ghjcnjnF358986' } all_devices = [CE_1_BORDER, CE_2, CE_3, CE_4] for device in all_devices: ssh_connect = ConnectHandler(**device)

До:

with open('myswitches') as f: ip_lines = f.read().

splitlines() print (ip_lines) for device in ip_lines: ip_address_of_device = device CE = { 'device_type': 'huawei', 'ip': ip_address_of_device, 'username': username, 'password': password } ssh_connect = ConnectHandler(**CE) output = ssh_connect.send_config_set(config_lines)

Синтаксис открытия файла ясен.

Я больше не записываю IP-адрес в словаре Netmiko. Вместо этого код теперь будет ссылаться на переменную для IP-адресов.

ip_address_of_device , что равно переменной устройство , который является частью цикла для кто читает ip_lines , представляющая собой переменную, содержащую IP-адреса устройств в файле.

«мои переключатели».



3. Убираю из скрипта пароль и логин

Хранить логин и пароль, как говорится, открытым текстом небезопасно:

CE = { 'device_type': 'huawei', 'ip': ip_address_of_device, 'username': 'vasyo1', 'password': '@ghjcnjnF358986' }

Это вряд ли будет приемлемо в производственной сети.

Поэтому я удалю их из скрипта, заменив переменными: я переделаю скрипт так, чтобы скрипт выводил на экран сообщение о необходимости ввода имени пользователя, а затем сохранял введенные значения в переменной.

Для этого я использую функцию вход() .

Функция вход() для версии Python 2.x это называется сырой ввод().

Функция getpass() Я использую его для ввода пароля.



username = input('Enter your SSH username: ') password = getpass()

В словаре заменяю имя пользователя и пароль переменными:

CE = { 'device_type': 'huawei', 'ip': ip_address_of_device, 'username': username, 'password': password }

В результате я получил улучшенный код, который сократился с 63 строк до 28 и стал более адаптированным для использования в реальной производственной практике.

Выглядит это так (работа скрипта можно посмотреть на видео На странице Клуб ИКТ Форума Huawei):

from getpass import getpass from netmiko import ConnectHandler username = input('Enter your SSH username: ') password = getpass() with open('switch_file_config') as f: config_lines = f.read().

splitlines() print (config_lines) with open('myswitches') as f: ip_lines = f.read().

splitlines() print (ip_lines) for device in ip_lines: ip_address_of_device = device CE = { 'device_type': 'huawei', 'ip': ip_address_of_device, 'username': username, 'password': password } ssh_connect = ConnectHandler(**CE) output = ssh_connect.send_config_set(config_lines) print(f"\n\n-------------- CE_{CE['ip']} --------------") print(output) print("-------------------- End -------------------")

Литература: https://stackoverflow.com/questions/5563089/raw-input-function-in-python https://pynet.twb-tech.com/blog/automation/netmiko.html https://pyneng.readthedocs.io/en/latest/book/18_ssh_telnet/netmiko.html https://github.com/ktbyers/netmiko https://github.com/ktbyers/netmiko/blob/master/netmiko/ssh_dispatcher.py Udemy.com - Сетевое программирование на Python для сетевых инженеров (Python 3) (Дэвид Бомбал) https://www.pythoncentral.io/pythons-range-function-explained Теги: #Сетевые технологии #python #сетевое оборудование #Huawei #python3 #netmiko #cloudengine #сетевая автоматизация

Вместе с данным постом часто просматривают: