Продолжаю возиться с рутинной автоматизацией в сети коммутаторов Huawei. На этот раз исследования, которые позволили нам сократить код в 3 раза, а именно: хосты и команды были вынесены в отдельные файлы, пароль и имя пользователя больше не хранятся в открытом виде.
Есть демонстрация запустить скрипт.
Визуально я воспринимаю вещи лучше, поэтому задачу по оптимизации скрипта я представил в графическом виде (см.
ниже), а именно, в ней отразились три основные задачи:
- Используйте файл инвентаризации, в котором перечислены IP-адреса всех сетевых устройств, а не создайте словарь для каждого из них.
- Перенесите команды конфигурации в отдельный файл и вызывайте его с помощью функции так же, как и файл инвентаризации.
- Избавьтесь от хранения пароля и имени пользователя в скрипте.
В комментарии к предыдущему посту «Мой друг Нетмико» был вопрос от пользователя андерс_и о том, насколько можно масштабировать скрипт:
Затем я использовал 4 виртуальных процессора Huawei CloudEngine в eNSP. В этот раз я постарался расширить их число настолько, насколько хватит мощности Huawei MateBook X Pro 2021. И нам удалось расширить его до 8. 9-й отказался запускаться, занятость 16гб оперативки составила 80%.
Обновленная топология выглядит следующим образом:
1. Создайте файл конфигурации.
Я предпочитаю редактор Nano (некоторые предпочитают Vim): nano switch_file_config В файле пишу все команды из предыдущего примера (команды могут быть любые в зависимости от потребностей) без пробелов/отступов.
Важный укажите команду возвращаться Последняя линия.
Насколько я понимаю, его нужно писать вручную только при использовании файла конфигурации — при написании команд в самой скрипке модуль Netmiko автоматически применяет ее и завершает SSH-соединение.
Без возвращаться скрипт не будет работать.
Список команд вынесен в отдельный файл:
Теперь весь предыдущий код:
Я сокращаю это до: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-адресов коммутатора:Здесь главное следить, чтобы не оставалось пробелов.
Сохраняю командой Ctrl+X. Для небольшого теста я создал файл Python под названием openfile.py. Я написал в нем простой скрипт, который будет открывать файл с IP-адресами и отображать их на экране: f = open ('myswitches')
for IP in f:
print (IP)
Запустил:
Как видите, первая строка осталась пустой, а это значит, что для Python она будет выглядеть как [` ',].
Если вы попытаетесь запустить такой файл, Python выдаст ошибку, что не удалось связаться с адресом назначения.
Поэтому лучше не допускать пустых строк.
Я настроил в eNSP еще 4 CE-коммутатора, присвоив им IP-адреса и настроив SSH-соединение:
Теперь я сокращу весь предыдущий код: 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 #сетевая автоматизация
-
Бюретки
19 Oct, 24 -
Обзор Видеоплееров Для Интернета
19 Oct, 24 -
Полезный Инструмент Для Visual Studio.net
19 Oct, 24