Узнайте о juniper Networks и Peez в этом гостевом посте Эриком Чжоу, автор Овладение сетью Python – второе издание Отказ
Juniper Networks всегда были любимыми среди толпы поставщика услуг. Если вы посмотрите на вертикали поставщика услуг, это имело бы смысл, что автоматизация сетевого оборудования находится на вершине их списка требований. Перед рассветом облачных центров обработки данных, поставщики услуг были теми, что с самым сетевым оборудованием.
Типичная корпоративная сеть может иметь несколько избыточных подключений к Интернету на корпоративном штаб-квартире с несколькими удаленными сайтами HUB-и-спицами, подключенными к HQ, используя частную сеть MPLS поставщика услуг. К поставщику услуг, они являются теми, кто должен построить, обеспечить, управлять и устранять неисправные соединения и базовые сети.
Они зарабатывают своими деньгами, продавая пропускную способность наряду с управляемыми услугами с добавленной стоимостью. Поставщики услуг имели бы смысл инвестировать в автоматизацию для использования наименьшего количества инженерных часов, чтобы поддерживать сеть. В случае их использования сетевая автоматизация является ключом к их конкурентным преимуществам.
Разница между потребностями сети поставщика услуг по сравнению с облачным центром данных является то, что традиционно поставщики услуг объединяют больше сервисов в одно устройство. Хорошим примером можно было бы многопротрококольное переключение метки (MPLS), что почти все основные поставщики услуг предоставляют, но редко адаптируются в сети предприятия или центра обработки данных. Juniper определил эту потребность и преуспел на выполнение требований поставщика услуг автоматизации.
Эта статья возьмет вас через некоторые из API на автоматизации можжевельника.
Juniper и NetConf
Протокол сети конфигурации (NetConf) является стандартом IETF, который был впервые опубликован в 2006 году, поскольку RFC 4741 и позже пересмотрел в РФК 6241. Juniper Networks вносил в значительной степени как стандарты РФК. Фактически, можжевельник был единственным автором для RFC 4741. Имеет смысл, что можжевельники полностью поддерживают NetConf, и он служит базовым слоем для большинства своих инструментов автоматизации и каркасов. Некоторые из основных характеристик NetConf включают следующее:
- Он использует расширяемый язык разметки (XML) для кодировки данных.
- Он использует вызовы удаленной процедуры (RPC). Поэтому в случае HTTP (ы) в качестве транспорта конечная точка URL идентична во время работы, указанная в корпусе запроса.
- Это концептуально основано на слоях сверху вниз. Слои включают содержание, операции, сообщения и транспортировку:
Juniper Networks предоставляет обширную INTCONF XML Protocol Protocol Руководство разработчиков в своей технической библиотеке. Пришло время взглянуть на его использование.
Подготовка устройства
Чтобы начать использовать NetConf, создайте отдельный пользователь, а также включить необходимые услуги:
set system login user netconf uid 2001 set system login user netconf class super-user set system login user netconf authentication encrypted-password "$1$0EkA.XVf$cm80A0GC2dgSWJIYWv7Pt1" set system services ssh set system services telnet set system services netconf ssh port 830
На устройстве Juniper вы всегда можете взглянуть на конфигурацию в плоском файле, либо в формате XML. Плоский файл поставляется удобно, когда вам нужно указать команду одноклассника для внесения изменений конфигурации:
netconf@foo> show configuration | display set set version 12.1R1.9 set system host-name foo set system domain-name bar
Формат XML вступает в удобное время, когда вам нужно увидеть структуру XML конфигурации:
netconf@foo> show configuration | display xml12.1R1.9 foo bar
Теперь вы готовы посмотреть на ваш первый пример Juniper NetConf.
Примеры Juniper NetConf
Вот довольно простой пример для выполнения версии Show. Назовите этот файл junos_netconf_1.py:
#!/usr/bin/env python3 from ncclient import manager conn = manager.connect( host='192.168.24.252', port='830', username='netconf', password='juniper!', timeout=10, device_params={'name':'junos'}, hostkey_verify=False) result = conn.command('show version', format='text') print(result) conn.close_session()
Все поля в сценарии должны быть красивыми самоочетами, за исключением устройства_парамсов. Начиная с NCClient 0.4.1, обработчик устройства был добавлен для уточнения разных поставщиков или платформ. Например, имя может быть можжевельника, CSR, Nexus или Huawei. Вы также добавили, поскольку вы используете самозаключенный сертификат с устройства Juniper.
Возвращенный выход – RPC-ответ, закодированный в XML с выходным элементом:
Вы можете анализировать вывод XML, чтобы просто включить выходной текст:
print(result.xpath('output')[0].text)
В Junos_netconf_2.py вы можете сделать изменения в настройке на устройство. Начните с некоторых новых импорта для построения новых элементов XML и объекта Connection Manager:
#!/usr/bin/env python3 from ncclient import manager from ncclient.xml_ import new_ele, sub_ele conn = manager.connect(host='192.168.24.252', port='830', username='netconf' , password='juniper!', timeout=10, device_params={'name':'junos'}, hostkey_v erify=False)
Заблокируйте конфигурацию и сделайте изменения конфигурации:
# lock configuration and make configuration changes conn.lock() # build configuration config = new_ele('system') sub_ele(config, 'host-name').text = 'master' sub_ele(config, 'domain-name').text = 'python'
В разделе «Конфигурация сборки» создайте новый элемент системы с подселементами Host-Namre и доменного имени. Если вам было задавалось вопросом о структуре иерархии, вы можете видеть из дисплея XML, структура узла с системой является родитель имени хоста и имени домена:
foo bar ...
После создания конфигурации сценарий будет толкает конфигурацию и зафиксирует изменения конфигурации. Это нормальные лучшие практики (замок, конфигурирование, разблокировка, фиксация) для изменений конфигурации можжевельника:
# send, validate, and commit config conn.load_configuration(config=config) conn.validate() commit_config = conn.commit() print(commit_config.tostring) # unlock config conn.unlock() # close session conn.close_session()
В следующем примере сочетается в себе код с несколькими функциями Python:
# make a connection object def connect(host, port, user, password): connection = manager.connect(host=host, port=port, username=user, password=password, timeout=10, device_params={'name':'junos'}, hostkey_verify=False) return connection # execute show commands def show_cmds(conn, cmd): result = conn.command(cmd, format='text') return result # push out configuration def config_cmds(conn, config): conn.lock() conn.load_configuration(config=config) commit_config = conn.commit() return commit_config.tostring
Этот файл может быть выполнен сам по себе, или он может быть импортирован для использования другими сценариями Python. Juniper также предоставляет библиотеку Python, которая будет использоваться с их устройствами, называемыми PEEZ. Теперь вы смотрите на несколько примеров использования библиотеки.
Juniper Peez для разработчиков
PEEZ – это реализация Python высокого уровня, которая лучше интегрируется с вашим существующим кодом Python. Используя API Python, вы можете выполнить общие задачи работы и конфигурации без обширных знаний о Junos CLI. Juniper поддерживает всеобъемлющий Гид разработчика Junos Peez на их технической библиотеке. Если вы заинтересованы в использовании PEEZ, он изгодно рекомендовал вам хотя бы взглянуть на различные темы в руководстве.
Установка и подготовка
Инструкции по установке для каждой из операционных систем можно найти на Установка Junos Peez Page Отказ Вот инструкции по установке для Ubuntu 16.04.
Ниже приведены некоторые пакеты зависимости:
$ sudo apt-get install -y python3-pip python3-dev libxml2-dev libxslt1-dev libssl-dev libffi-dev
Пакеты PEEZ могут быть установлены через PIP:
$ sudo pip3 install junos-eznc $ sudo pip install junos-eznc
На устройстве Juniper NetConf необходимо настроить в качестве базового XML API для PEEZ:
set system services netconf ssh port 830
Для аутентификации пользователя вы можете либо использовать аутентификацию пароля, либо пару клавиш SSH. Создание локального пользователя простой:
set system login user netconf uid 2001 set system login user netconf class super-user set system login user netconf authentication encrypted-password "$1$0EkA.XVf$cm80A0GC2dgSWJIYWv7Pt1"
Для аутентификации клавиш SSH создайте пару ключей на HostFirst:
$ ssh-keygen -t rsa
По умолчанию открытый ключ будет называться id_rsa.pub под ~/.ssh/, а закрытый ключ будет назван ID_RSA в том же каталоге. Относитесь к закрытому ключу, как пароль, который вы никогда не делитесь. Открытый ключ может быть свободно распространен.
В этом случае переместите открытый ключ к каталогу/TMP и включите модуль HTTP-сервера Python 3 для создания доступного URL-адреса:
$ mv ~/.ssh/id_rsa.pub /tmp $ cd /tmp $ python3 -m http.server Serving HTTP on 0.0.0.0 port 8000 ...
Примечание. Для Python 2 вместо этого используйте Python -M SimpleHttPerver.
С устройства Juniper вы можете создать пользователь и ассоциировать открытый ключ, загрузив открытый ключ от веб-сервера Python 3:
netconf@foo# set system login user echou class super-user authentication load-key-file http://192.168.24.164:8000/id_rsa.pub /var/home/netconf/...transferring.file........100% of 394 B 2482 kBps
Теперь, если вы попытаетесь SSH с закрытым ключом от станции управления, пользователь будет автоматически аутентифицирован:
$ ssh -i ~/.ssh/id_rsa 192.168.24.252 --- JUNOS 12.1R1.9 built 2012-03-24 12:52:33 UTC echou@foo>
Чтобы обеспечить работу обоих методов аутентификации с PEEZ, попробуйте комбинацию имени пользователя и пароля:
Python 3.5.2 (default, Nov 17 2016, 17:05:23) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from jnpr.junos import Device >>> dev = Device(host='192.168.24.252', user='netconf', password='juniper!') >>> dev.open() Device(192.168.24.252) >>> dev.facts {'serialnumber': '', 'personality': 'UNKNOWN', 'model': 'olive', 'ifd_style': 'CLASSIC', '2RE': False, 'HOME': '/var/home/juniper', 'version_info': junos.version_info(major=(12, 1), type=R, minor=1, build=9), 'switch_style': 'NONE', 'fqdn': 'foo.bar', 'hostname': 'foo', 'version': '12.1R1.9', 'domain': 'bar', 'vc_capable': False} >>> dev.close()
Вы также можете попробовать использовать аутентификацию ключа SSH:
>>> from jnpr.junos import Device >>> dev1 = Device(host='192.168.24.252', user='echou', ssh_private_key_file='/home/echou/.ssh/id_rsa') >>> dev1.open() Device(192.168.24.252) >>> dev1.facts {'HOME': '/var/home/echou', 'model': 'olive', 'hostname': 'foo', 'switch_style': 'NONE', 'personality': 'UNKNOWN', '2RE': False, 'domain': 'bar', 'vc_capable': False, 'version': '12.1R1.9', 'serialnumber': '', 'fqdn': 'foo.bar', 'ifd_style': 'CLASSIC', 'version_info': junos.version_info(major=(12, 1), type=R, minor=1, build=9)} >>> dev1.close()
Большой! Теперь вы готовы посмотреть на некоторые примеры для PEEZ.
Примеры PEEZ
В предыдущем интерактивном подскажите, вы уже видели, что при подключении устройства объект автоматически извлекает несколько фактов о устройстве. В первом примере Junos_Pyez_1.py вы подключались к устройству и выполняли RPC вызов для Show Interface EM1:
#!/usr/bin/env python3 from jnpr.junos import Device import xml.etree.ElementTree as ET import pprint dev = Device(host='192.168.24.252', user='juniper', passwd='juniper!') try: dev.open() except Exception as err: print(err) sys.exit(1) result = dev.rpc.get_interface_information(interface_name='em1', terse=True) pprint.pprint(ET.tostring(result)) dev.close()
Класс устройства имеет свойство RPC, которое включает в себя все операционные команды. Это довольно круто, потому что нет проскальзывания между тем, что вы можете сделать в CLI против API. Компания в том, что вам нужно найти тег элемента XML RPC. В первом примере, как вы знаете, Show Interface EM1 приравнивается к get_interface_information? У вас есть три способа выявления этой информации:
- Вы можете ссылаться на ссылку эксплуатационного разработчика API JUNOS XML API.
- Вы можете использовать CLI и отображать эквивалент XML RPC и замените тире (-) между словами с подчеркиванием (_).
- Вы также можете сделать это программно, используя библиотеку PEEZ. Как правило, второй вариант используется для непосредственного выхода:
netconf@foo> show interfaces em1 | display xml rpcem1
Вот пример использования PEEZ программно (третий вариант):
>>> dev1.display_xml_rpc('show interfaces em1', format='text') 'n n'em1n
Конечно, вам нужно будет делать изменения конфигурации. В примере конфигурации Junos_Pyez_2.py Импортируйте дополнительный метод CONFIG () из PEEZ:
#!/usr/bin/env python3 from jnpr.junos import Device from jnpr.junos.utils.config import Config
Используйте тот же блок для подключения к устройству:
dev = Device(host='192.168.24.252', user='juniper', passwd='juniper!') try: dev.open() except Exception as err: print(err) sys.exit(1)
Новый метод CONFIG () будет загружать данные XML и внести изменения в конфигурацию:
config_change = """""" cu = Config(dev) cu.lock() cu.load(config_change) cu.commit() cu.unlock() dev.close() master python
Примеры PEEZ просты по дизайну. Надеюсь, что им было достаточно, чтобы объяснить вам, как вы можете использовать PEEZ для ваших потребностей автоматизации Junos.
Если вы нашли эту статью полезную, вы можете исследовать Овладение сетью Python – второе издание Отказ Написанные Эрически Чжоу, опытная техника с более чем 18-летним опытом, книга упакована с помощью практических примеров использования Python для автоматизации сетевых устройств, DEVOPS и SDN и является обязательным для инженеров и программистов