Рубрики
Без рубрики

Python API для сетей можжевельников

Узнайте о Juniper Networks и Peez в этом гостевом посте Эриком Чжоу, автор овладевания Python Networking – второе издание …

Автор оригинала: PACKT.

Узнайте о 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 включают следующее:

  1. Он использует расширяемый язык разметки (XML) для кодировки данных.
  2. Он использует вызовы удаленной процедуры (RPC). Поэтому в случае HTTP (ы) в качестве транспорта конечная точка URL идентична во время работы, указанная в корпусе запроса.
  3. Это концептуально основано на слоях сверху вниз. Слои включают содержание, операции, сообщения и транспортировку:

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 xml


12.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 с выходным элементом:



Hostname: foo
    Model: olive
    JUNOS Base OS boot [12.1R1.9]
    JUNOS Base OS Software Suite [12.1R1.9]

    JUNOS Runtime Software Suite [12.1R1.9]
    JUNOS Routing Software Suite [12.1R1.9]


Вы можете анализировать вывод 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? У вас есть три способа выявления этой информации:

  1. Вы можете ссылаться на ссылку эксплуатационного разработчика API JUNOS XML API.
  2. Вы можете использовать CLI и отображать эквивалент XML RPC и замените тире (-) между словами с подчеркиванием (_).
  3. Вы также можете сделать это программно, используя библиотеку PEEZ. Как правило, второй вариант используется для непосредственного выхода:
    netconf@foo> show interfaces em1 | display xml rpc



em1






Вот пример использования PEEZ программно (третий вариант):

>>> dev1.display_xml_rpc('show interfaces em1', format='text')
    'n em1nn'

Конечно, вам нужно будет делать изменения конфигурации. В примере конфигурации 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 = """

master
python

      """

      cu = Config(dev)
      cu.lock()
      cu.load(config_change)
      cu.commit()
      cu.unlock()

      dev.close()

Примеры PEEZ просты по дизайну. Надеюсь, что им было достаточно, чтобы объяснить вам, как вы можете использовать PEEZ для ваших потребностей автоматизации Junos.

Если вы нашли эту статью полезную, вы можете исследовать Овладение сетью Python – второе издание Отказ Написанные Эрически Чжоу, опытная техника с более чем 18-летним опытом, книга упакована с помощью практических примеров использования Python для автоматизации сетевых устройств, DEVOPS и SDN и является обязательным для инженеров и программистов