Автоматизация 6. Napalm
21 апр 2021 07:40 #101925
от ICT
ICT создал тему: Автоматизация 6. Napalm
Приветствую всех читателей цикла, мы продолжаем знакомиться с инструментами по автоматизации конфигурирования сетевой инфраструктуры. Предыдущие статьи:Краткая теория SDN и предпосылок автоматизацииПрактика с TelnetLibПрактика с ParamikoПрактика с Netmiko. Часть 1Практика с Netmiko. Часть 2
Теория по Napalm Прежде чем рассказывать о новой библиотеке, позволим себе небольшое лирическое отступление. После того, как мы достаточно подробно изучили Netmiko, казалось бы все наши потребности будут удовлетворены и мы можем выполнять любые задачи. Но как известно - аппетит растет во время еды, и вот уже у нас рождаются новые "хотелки" в виде более глубокой работы с конфигурацией оборудования: версионирование изменений, откат к предыдущей конфигурации и пр. Подобные задачи уже не решить с помощью Netmiko, который отлично справляется с базовым взаимодействием с сетевым оборудованием (сбор и отправка конфигурации, установка соединения и т.д). Библиотека Napalm (Network Automation and Programmability Abstraction Layer with Multivendor support), опенсорсный проект написан на языке Python, содержит различные функции для взаимодействия с различными сетевыми ОС за счет единого API. По своей архитектуре, Napalm требует определенного драйвера для работы с тем или иным вендором. В официальный список - "Napalm Core Developers" (нативная поддержка взаимодействия с ОС) входят: Как вы можете заметить из таблицы, представленной выше, далеко не все системы поддерживаются, поскольку для них нет драйвера. Кроме того, есть ограничения по версии ОС и поддерживаемым функциям. Например, IOS не имеет своего API для отправки команд, поэтому внутри Napalm используется библиотека Netmiko. В свою очередь, на Github есть репозиторий "Community Drivers", где отдельные разработчики-энтузиасты предлагают драйвера для неподдерживаемых изначально сетевых ОС (ссылка). За счет сообщества, вы сможете опробовать Napalm с такими системами как VyOS, Dlink, FortiOS и др. Кроме ограничений, связанных с наличием соответствующего драйвера, также есть матрица поддержки функций Napalm: В целом почти все опции работают:замена конфигурации;добавление конфигурации;сравнение конфигурации;откат изменений.
Укажем расшифровку примечаний: [2] - Реализовано за счет API Napalm, по скольку не поддерживается ОС изначально.
[3] - Не поддерживается, но эмулируется.
[4] - Для слияний, часть возможностей по сравнению - отсутствует.
[5] - Не поддерживается, но эмулируется. С более подробным описанием функций возможно ознакомиться в официальном документе по Napalm, крайне рекомендовано понимать их назначение, прежде чем писать какой-либо скрипт. В качестве сетевого протокола по доставке команд используются: Установка Для начала потребуется установить библиотеку Napalm на ваш хост управления, стабильно пакет работает в Linux, поэтому мы остановимся на одном из его дистрибутивов (Ubuntu). apt-get update
apt-get install python -y
apt-get install build-essential libssl-dev libffi-dev -y
apt-get install python3-pip -y
pip3 install -U cryptography
pip3 install -U netmiko
pip3 install -U napalm
pip3 install -U simplejson Кроме установки пакета самой библиотеки Napalm, также понадобится: python3, pip, cryptography, netmiko, simplejson. После успешной установки, начинаем знакомство с базовым синтаксисом библиотеки и ее возможностями, для установки соединения с сетевым оборудованием потребуются строки кода: "> from napalm import get_network_driver
"> driver = get_network_driver("eos")
"> device = driver("192.168.76.10", "admin", "pass")
"> device.open()импортируется общая библиотека драйверов;указывается драйвер устройства в переменной "driver";объявляется переменная "device", которая содержит необходимые параметры для подключения;устанавливается соединение.Первые скрипты После первичной инициализации подключения, становятся доступны команды по работе с конфигурацией: from napalm import get_network_driver # импорт драйвера
driver = get_network_driver("ios") # выбор типа OS
iosvl2 = driver("192.168.122.72", "david", "cisco") # параметры
iosvl2.open()
ios_output = iosvl2.get_facts()# сбор фактов
print (ios_output) Как видим, после выполнения скрипта, на экране пользователя вывелись факты об устройстве, согласно методу - "get_facts". Информации достаточно много, пусть и не в самом удобно читаемом виде. Чтобы решить проблему с выводом, мы используем библиотеку json. Формат JSON является структурированным текстовым типом данных, достаточно удобным для чтения человеком. Добавим следующие строки в предыдущий скрипт, как первую и последнюю строчку (вместо обычного print) соответственно: import json
print json.dumps(ios_output, indent=4) После изменений получим вывод: Соответственно, получили данные от сетевого оборудования Cisco, которые представлены в формате JSON, что в разы повышает их читаемость и удобство для дальнейшей работы. Сравнение конфигурации Прежде чем отправлять какие-либо изменения в конфигурацию вашего сетевого устройства, с помощью Napalm появляется возможность сравнить настройки (доступно при поддержке ОС). Считаем файл-кандидат с новыми настройками и вызовем метод сравнения настроек: "> device.load_replace_candidate(filename="test/new_good.conf")
"> print(device.compare_config()) + hostname pyeos-unittest-changed
- hostname pyeos-unittest
router bgp 65000
vrf test
+ neighbor 1.1.1.2 maximum-routes 12000
+ neighbor 1.1.1.2 remote-as 1
- neighbor 1.1.1.1 remote-as 1
- neighbor 1.1.1.1 maximum-routes 12000
vrf test2
+ neighbor 2.2.2.3 remote-as 2
+ neighbor 2.2.2.3 maximum-routes 12000
- neighbor 2.2.2.2 remote-as 2
- neighbor 2.2.2.2 maximum-routes 12000
interface Ethernet2
+ description ble
- description bla Библиотека наглядно выводит ожидаемые изменения на экран пользователя, где знаками "+" и "-" отмечены новые строки или те, которые будут удалены, соответственно. Для того чтобы принять изменения, посылается команда: "> device.commit_config() Если вы изменили свое решение и не хотите применять новые настройки, то: "> device.discard_config() Слияние конфигураций В целом логика та же, что и в предыдущем сценарии отправки новой конфигурации, только необходимо передавать новый файл при вызове метода слияния: "> device.load_merge_candidate(config="test\description bla")
"> print(device.compare_config())
configure
hostname test
interface Ethernet2
description bla
end Для того чтобы принять изменения, посылается команда: "> device.commit_config() Если вы изменили свое решение и не хотите применять новые настройки, то: "> device.discard_config() Откат принятой конфигурации Может возникнуть ситуация, когда после операции device.commit_config()необходимо будет откатить изменения, библиотека поддерживает эту функцию: "> device.rollback() Окончание сессии Наконец, для завершения соединения с оборудованием достаточно команды: "> device.close() Вместо заключения Сегодня мы познакомились с библиотекой Napalm, способной гибко взаимодействовать с конфигурацией сетевого оборудования, позволяя учитывать примененную версию настроек, откатывать изменения и т.д. Далее планируется еще одна статья по Napalm, где уже будут разобраны исключительно готовые скрипты для решения различных практических кейсов, на сегодня всё, до встречи на NAG.ru. Ссылка на источник
Теория по Napalm Прежде чем рассказывать о новой библиотеке, позволим себе небольшое лирическое отступление. После того, как мы достаточно подробно изучили Netmiko, казалось бы все наши потребности будут удовлетворены и мы можем выполнять любые задачи. Но как известно - аппетит растет во время еды, и вот уже у нас рождаются новые "хотелки" в виде более глубокой работы с конфигурацией оборудования: версионирование изменений, откат к предыдущей конфигурации и пр. Подобные задачи уже не решить с помощью Netmiko, который отлично справляется с базовым взаимодействием с сетевым оборудованием (сбор и отправка конфигурации, установка соединения и т.д). Библиотека Napalm (Network Automation and Programmability Abstraction Layer with Multivendor support), опенсорсный проект написан на языке Python, содержит различные функции для взаимодействия с различными сетевыми ОС за счет единого API. По своей архитектуре, Napalm требует определенного драйвера для работы с тем или иным вендором. В официальный список - "Napalm Core Developers" (нативная поддержка взаимодействия с ОС) входят: Как вы можете заметить из таблицы, представленной выше, далеко не все системы поддерживаются, поскольку для них нет драйвера. Кроме того, есть ограничения по версии ОС и поддерживаемым функциям. Например, IOS не имеет своего API для отправки команд, поэтому внутри Napalm используется библиотека Netmiko. В свою очередь, на Github есть репозиторий "Community Drivers", где отдельные разработчики-энтузиасты предлагают драйвера для неподдерживаемых изначально сетевых ОС (ссылка). За счет сообщества, вы сможете опробовать Napalm с такими системами как VyOS, Dlink, FortiOS и др. Кроме ограничений, связанных с наличием соответствующего драйвера, также есть матрица поддержки функций Napalm: В целом почти все опции работают:замена конфигурации;добавление конфигурации;сравнение конфигурации;откат изменений.
Укажем расшифровку примечаний: [2] - Реализовано за счет API Napalm, по скольку не поддерживается ОС изначально.
[3] - Не поддерживается, но эмулируется.
[4] - Для слияний, часть возможностей по сравнению - отсутствует.
[5] - Не поддерживается, но эмулируется. С более подробным описанием функций возможно ознакомиться в официальном документе по Napalm, крайне рекомендовано понимать их назначение, прежде чем писать какой-либо скрипт. В качестве сетевого протокола по доставке команд используются: Установка Для начала потребуется установить библиотеку Napalm на ваш хост управления, стабильно пакет работает в Linux, поэтому мы остановимся на одном из его дистрибутивов (Ubuntu). apt-get update
apt-get install python -y
apt-get install build-essential libssl-dev libffi-dev -y
apt-get install python3-pip -y
pip3 install -U cryptography
pip3 install -U netmiko
pip3 install -U napalm
pip3 install -U simplejson Кроме установки пакета самой библиотеки Napalm, также понадобится: python3, pip, cryptography, netmiko, simplejson. После успешной установки, начинаем знакомство с базовым синтаксисом библиотеки и ее возможностями, для установки соединения с сетевым оборудованием потребуются строки кода: "> from napalm import get_network_driver
"> driver = get_network_driver("eos")
"> device = driver("192.168.76.10", "admin", "pass")
"> device.open()импортируется общая библиотека драйверов;указывается драйвер устройства в переменной "driver";объявляется переменная "device", которая содержит необходимые параметры для подключения;устанавливается соединение.Первые скрипты После первичной инициализации подключения, становятся доступны команды по работе с конфигурацией: from napalm import get_network_driver # импорт драйвера
driver = get_network_driver("ios") # выбор типа OS
iosvl2 = driver("192.168.122.72", "david", "cisco") # параметры
iosvl2.open()
ios_output = iosvl2.get_facts()# сбор фактов
print (ios_output) Как видим, после выполнения скрипта, на экране пользователя вывелись факты об устройстве, согласно методу - "get_facts". Информации достаточно много, пусть и не в самом удобно читаемом виде. Чтобы решить проблему с выводом, мы используем библиотеку json. Формат JSON является структурированным текстовым типом данных, достаточно удобным для чтения человеком. Добавим следующие строки в предыдущий скрипт, как первую и последнюю строчку (вместо обычного print) соответственно: import json
print json.dumps(ios_output, indent=4) После изменений получим вывод: Соответственно, получили данные от сетевого оборудования Cisco, которые представлены в формате JSON, что в разы повышает их читаемость и удобство для дальнейшей работы. Сравнение конфигурации Прежде чем отправлять какие-либо изменения в конфигурацию вашего сетевого устройства, с помощью Napalm появляется возможность сравнить настройки (доступно при поддержке ОС). Считаем файл-кандидат с новыми настройками и вызовем метод сравнения настроек: "> device.load_replace_candidate(filename="test/new_good.conf")
"> print(device.compare_config()) + hostname pyeos-unittest-changed
- hostname pyeos-unittest
router bgp 65000
vrf test
+ neighbor 1.1.1.2 maximum-routes 12000
+ neighbor 1.1.1.2 remote-as 1
- neighbor 1.1.1.1 remote-as 1
- neighbor 1.1.1.1 maximum-routes 12000
vrf test2
+ neighbor 2.2.2.3 remote-as 2
+ neighbor 2.2.2.3 maximum-routes 12000
- neighbor 2.2.2.2 remote-as 2
- neighbor 2.2.2.2 maximum-routes 12000
interface Ethernet2
+ description ble
- description bla Библиотека наглядно выводит ожидаемые изменения на экран пользователя, где знаками "+" и "-" отмечены новые строки или те, которые будут удалены, соответственно. Для того чтобы принять изменения, посылается команда: "> device.commit_config() Если вы изменили свое решение и не хотите применять новые настройки, то: "> device.discard_config() Слияние конфигураций В целом логика та же, что и в предыдущем сценарии отправки новой конфигурации, только необходимо передавать новый файл при вызове метода слияния: "> device.load_merge_candidate(config="test\description bla")
"> print(device.compare_config())
configure
hostname test
interface Ethernet2
description bla
end Для того чтобы принять изменения, посылается команда: "> device.commit_config() Если вы изменили свое решение и не хотите применять новые настройки, то: "> device.discard_config() Откат принятой конфигурации Может возникнуть ситуация, когда после операции device.commit_config()необходимо будет откатить изменения, библиотека поддерживает эту функцию: "> device.rollback() Окончание сессии Наконец, для завершения соединения с оборудованием достаточно команды: "> device.close() Вместо заключения Сегодня мы познакомились с библиотекой Napalm, способной гибко взаимодействовать с конфигурацией сетевого оборудования, позволяя учитывать примененную версию настроек, откатывать изменения и т.д. Далее планируется еще одна статья по Napalm, где уже будут разобраны исключительно готовые скрипты для решения различных практических кейсов, на сегодня всё, до встречи на NAG.ru. Ссылка на источник
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Похожие статьи
Тема | Релевантность | Дата |
---|---|---|
Автоматизация 7. Napalm в действии | 18.27 | Вторник, 11 мая 2021 |
Автоматизация 4. Netmiko | 7.79 | Четверг, 11 марта 2021 |
Автоматизация работы сетевого администратора | 7.62 | Понедельник, 11 января 2021 |
Трансформация это в бизнесе, а в ИТ - автоматизация. Не путайте | 7.62 | Понедельник, 13 июня 2022 |
Трансформация - это в бизнесе, а в ИТ - автоматизация. Не путайте | 7.62 | Вторник, 14 июня 2022 |
Автоматизация как ответ на кадровый голод | 7.62 | Вторник, 24 января 2023 |
Axelot интегрировала «1С:WMS» и КИС «1С:Комплексная автоматизация» для «Квадрата» | 7.53 | Вторник, 10 ноября 2015 |
В институте физиологии им. И. П. Павлова РАН завершена автоматизация ФХД | 7.53 | Четверг, 22 сентября 2016 |
54-ФЗ: теперь в «1С:ERP», «1С:Управление торговлей» и «1С:Комплексная автоматизация» | 7.53 | Пятница, 03 февраля 2017 |
«1С-Рарус» обеспечила CRM-функциональностью «1С:ERP» и «1С:Комплексная автоматизация» | 7.53 | Пятница, 07 апреля 2017 |