Использование Junos PyEZ для извлечения конфигурации
Junos PyEZ приложения могут выполнять удаленные вызовы процедур (RPC) по требованию на устройствах, работающих Junos OS. После создания экземпляра класса Device
приложение может запустить RPC как свойство экземпляра Device
. Junos PyEZ get_config()
приложения могут использовать RPC для запроса полной конфигурации или выбранных частей конфигурации как для стандартной конфигурации Junos OS, так и для данных конфигурации, соответствующей стандарту (IETF, OpenConfig) или пользовательским моделям данных YANG, которые были добавлены к устройству.
RPC Junos PyEZ get_config
вызывает операцию Junos XML <get-configuration>
. Дополнительные сведения об операции <get-configuration>
и ее параметрах см. в < -конфигурации>.
В этом разделе обсуждается извлечение конфигурации с помощью Junos PyEZ get_config()
RPC. Для получения сведений об использовании таблиц и представлений для получения данных конфигурации см. определение таблиц конфигурации Junos PyEZ и использование таблиц конфигурации Junos PyEZ для извлечения данных конфигурации.
Извлечение полной конфигурации кандидатов
Чтобы получить полную конфигурацию кандидатов с устройства, на Junos OS, выполните get_config()
RPC. Формат вывода по умолчанию — XML. Например:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config() print (etree.tostring(data, encoding='unicode', pretty_print=True))
Указание базы данных источника для данных конфигурации
Когда приложение Junos PyEZ get_config()
использует RPC для извлечения сведений о конфигурации с устройства, на Junos OS, по умолчанию сервер возвращает данные из базы данных кандидатов в конфигурации. Приложение Junos PyEZ также может извлекать данные конфигурации из базы данных о конфигурации или из базы данных электронной конфигурации.
База данных конфигурации кандидатов
Чтобы получить данные из базы данных кандидатов в конфигурации, выполните get_config()
RPC и при желании включит любые дополнительные аргументы.
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config() print (etree.tostring(data, encoding='unicode', pretty_print=True))
База данных о конфигурации с поручеными настройками
Чтобы получить данные из базы данных о конфигурации, options
включим аргумент с в 'database':'committed'
вызове get_config()
RPC.
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(options={'database' : 'committed'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
База данных электронной конфигурации
Начиная с Junos PyEZ версии 2.1.3, Junos PyEZ поддерживает операции с оперативной базой данных конфигурации устройств, которые поддерживают эту базу данных. При извлечении данных конфигурации из общей базы данных конфигурации результаты по умолчанию не включают данные из базы данных электронной конфигурации.
Эта база данных является альтернативной базой данных конфигурации, которая обеспечивает быстрый программный интерфейс для обновления конфигурации устройств, работающих Junos OS. База данных оперативной конфигурации является усовершенствованой функцией, которая при неправильном ее настройке может оказать серьезное негативное влияние на работу устройства. Дополнительные сведения см. в "Сведения о базе данных электронной конфигурации".
Чтобы получить данные из экземпляра по умолчанию в базе данных электронной конфигурации, сначала откройте экземпляр по умолчанию, а затем запросить данные. Чтобы открыть экземпляр по умолчанию, используйте диспетчер контекстов, чтобы создать экземпляр Config
и включить аргумент mode='ephemeral'
. Например:
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from lxml import etree dev = Device(host='router1.example.net') try: dev.open() with Config(dev, mode='ephemeral') as cu: data = dev.rpc.get_config(options={'format':'text'}) print(etree.tostring(data, encoding='unicode')) dev.close() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) except Exception as err: print (err)
Чтобы получить данные из конкретного экземпляра базы данных электронной конфигурации, сначала откройте этот экземпляр и затем запросим данные. Чтобы открыть экземпляр электронной базы данных, определенной пользователем, Config
используйте диспетчер контекстов для создания экземпляра, mode='ephemeral'
ephemeral_instance
включив аргумент и включив в него имя.
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from lxml import etree dev = Device(host='router1.example.net') try: dev.open() with Config(dev, mode='ephemeral', ephemeral_instance='eph1') as cu: data = dev.rpc.get_config(options={'format':'text'}) print(etree.tostring(data, encoding='unicode')) dev.close() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) except Exception as err: print (err)
Указание области данных конфигурации для возврата
В дополнение к извлечению полной конфигурации Junos OS, приложение PyEZ Junos PyEZ get_config()
может извлечь определенные части конфигурации, вызвоив RPC с помощью аргумента filter_xml
. Параметр filter_xml
берет строку, содержащую фильтр подtree, который выбирает возвратных параметров конфигурации. Фильтр подлиности возвращает данные конфигурации, которые соответствуют критериям выбора.
Для запроса нескольких иерархий строка filter_xml
должна включать корневой <configuration>
элемент. В противном случае значение должно filter_xml
представлять <configuration>
все уровни иерархии конфигурации, начиная только под корневым элементом вниз, чтобы отобразить иерархию. Чтобы выбрать подtree, включим пустую метку для этого уровня иерархии. Чтобы вернуть конкретный объект, включим узел совпадения содержимого, определяя элемент и совпадающие значения.
Следующее Junos PyEZ [edit interfaces]
[edit protocols]
извлекает и печатает конфигурацию на уровнях иерархии и на уровне кандидатов:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: filter = '<configuration><interfaces/><protocols/></configuration>' data = dev.rpc.get_config(filter_xml=filter) print (etree.tostring(data, encoding='unicode', pretty_print=True))
Следующий пример извлекает и распечатает [edit system services]
конфигурацию на уровне иерархии, используя для аргумента разные, но эквивалентные значения filter_xml
:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='<system><services/></system>') print (etree.tostring(data, encoding='unicode', pretty_print=True)) data = dev.rpc.get_config(filter_xml='system/services') print (etree.tostring(data, encoding='unicode', pretty_print=True)) filter = etree.XML('<system><services/></system>') data = dev.rpc.get_config(filter_xml=filter) print (etree.tostring(data, encoding='unicode', pretty_print=True))
В следующем примере элемент <name>
иерархии <interface>
<interfaces>
в конфигурации post-наследование:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: filter = '<interfaces><interface><name/></interface></interfaces>' data = dev.rpc.get_config(filter_xml=filter, options={'inherit':'inherit'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
user@server:~$ python3 junos-pyez-get-interface-names.py <configuration changed-seconds="1544032801" changed-localtime="2018-12-05 10:00:01 PST"> <interfaces> <interface> <name>ge-1/0/0</name> </interface> <interface> <name>ge-1/0/1</name> </interface> <interface> <name>lo0</name> </interface> <interface> <name>fxp0</name> </interface> </interfaces> </configuration>
В следующем примере извлекается подtree для интерфейса ge-1/0/1:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: filter = '<interfaces><interface><name>ge-1/0/1</name></interface></interfaces>' data = dev.rpc.get_config(filter_xml=filter, options={'inherit':'inherit'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
user@server:~$ python3 junos-pyez-get-single-interface.py <configuration changed-seconds="1544032801" changed-localtime="2018-12-05 10:00:01 PST"> <interfaces> <interface> <name>ge-1/0/1</name> <description>customerA</description> <disable/> <unit> <name>0</name> <family> <inet> <address> <name>198.51.100.1/24</name> </address> </inet> </family> </unit> </interface> </interfaces> </configuration>
Указание формата для возврата данных конфигурации
Junos PyEZ get_config()
RPC вызывает операцию Junos XML <get-configuration>
, которая может вернуть Junos OS данные конфигурации в Junos элементов XML, интерфейс командной строки настроек, Junos OS set
команд или Нотации объектов JavaScript (JSON). По умолчанию get_config()
RPC возвращает данные конфигурации в XML.
Чтобы указать формат, в котором будут возвращены данные конфигурации, Junos PyEZ options
включает словарь с в 'format':'format'
списке get_config()
аргументов. Чтобы запросить интерфейс командной строки конфигурации, set
Junos OS команд, или формата JSON, text
format
установите значение в , set
json
или, соответственно,
Как и в сеансах протокола NETCONF Junos XML, Junos PyEZ возвращает данные конфигурации в ожидаемом формате, вложенном в соответствующий элемент XML для этого формата. Ответ RPC охватывает данные конфигурации в форматах XML, set
<configuration>
текста или команд в формате и <configuration-text>
<configuration-set>
элементах, соответственно.
from jnpr.junos import Device from lxml import etree from pprint import pprint with Device(host='router1.example.net') as dev: # XML format (default) data = dev.rpc.get_config() print (etree.tostring(data, encoding='unicode', pretty_print=True)) # Text format data = dev.rpc.get_config(options={'format':'text'}) print (etree.tostring(data, encoding='unicode', pretty_print=True)) # Junos OS set format data = dev.rpc.get_config(options={'format':'set'}) print (etree.tostring(data, encoding='unicode', pretty_print=True)) # JSON format data = dev.rpc.get_config(options={'format':'json'}) pprint (data)
В зависимости от версии Python и формата выходных данных может потребоваться изменить утверждение печати, чтобы отобразить больше человекочитаемых результатов.
Извлечение данных конфигурации для стандартных или пользовательских моделей данных YANG
Стандартные или пользовательские модули YANG можно загрузить на устройства, работающие Junos OS, чтобы добавить модели данных, которые не поддерживаются стандартом Junos OS но могут поддерживаться трансляцией. Модели ненативных данных в конфигурации кандидатов настраиваются с помощью синтаксиса, определенного для этих моделей. При фиксации конфигурации сценарии трансляции модели данных преобразовывания этих данных и сфиксации соответствующей конфигурации Junos OS как переходное изменение конфигурации проверки.
Кандидат в активные конфигурации содержит данные конфигурации для ненативных моделей данных YANG в синтаксисе, определенном этими моделями. Начиная с Junos PyEZ выпуска 2.1.0, приложения Junos PyEZ могут извлекать данные конфигурации для стандартного (IETF, OpenConfig) и пользовательских моделей данных YANG, в дополнение к извлечению исходной конфигурации Junos OS, включив соответствующие аргументы в get_config()
RPC. По умолчанию данные ненативной конфигурации не включены в get_config()
ответ RPC.
Для получения данных конфигурации, определяемой ненативной моделью данных YANG в дополнение к извлечению Junos OS конфигурации, get_config()
выполните RPC model
с аргументом и namespace
включит аргумент, если это необходимо. Аргумент model
принимает одно из следующих значений:
custom
- Извлекать данные конфигурации, определяемые пользовательскими моделями данных YANG. Этот аргумент необходимо включитьnamespace
при искомом сборе данных для пользовательских моделей данных YANG.ietf
- Извлекать данные конфигурации, определяемую IETF моделей данных YANG.openconfig
- Извлекать данные конфигурации, определенные моделями данных OpenConfig YANG.True
- Извлекать все данные конфигурации, включая полную конфигурацию Junos OS и данные из любых моделей данных YANG.
Если указать значение ietf
аргумента openconfig
model
, Junos PyEZ автоматически использует соответствующее пространство имен. При извлечении данных для пользовательской модели данных YANGmodel='custom'
namespace
, необходимо также включить аргумент с соответствующим пространством имен.
model
custom
Если включить аргумент со значением (или ietf
openconfig
filter_xml
включить аргумент для возврата определенного подtree XML), Junos OS возвращает иерархию совпадающих данных только из ненативной модели данных. Если конфигурация Junos OS содержит иерархию с таким именем, например "interfaces", она не включается в ответ. Этот filter_xml
параметр не поддерживается при использованииmodel=True
.
В следующем примере get_config()
RPC извлекает иерархию конфигурации OpenConfig bgp
из конфигурации candidate на устройстве. Если аргумент не был filter_xml
затмеен, RPC возвращает полные конфигурации Junos OS и openConfig candidate.
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='bgp', model='openconfig') print (etree.tostring(data, encoding='unicode', pretty_print=True))
Следующий RPC извлекает иерархию interfaces
конфигурации из конфигурации кандидатов для IETF данных YANG:
data = dev.rpc.get_config(filter_xml='interfaces', model='ietf') print (etree.tostring(data, encoding='unicode', pretty_print=True))
Следующий RPC извлекает иерархию l2vpn
конфигурации из конфигурации кандидатов для пользовательской модели данных YANG с заданным пространством имен:
data = dev.rpc.get_config(filter_xml='l2vpn', model='custom', namespace='http://yang.juniper.net/customyang/demo/l2vpn') print (etree.tostring(data, encoding='unicode', pretty_print=True))
Следующий RPC извлекает полную Junos OS конфигурацию кандидатов, а также данные конфигурации для других моделей данных YANG, которые были добавлены к устройству:
data = dev.rpc.get_config(model=True) print (etree.tostring(data, encoding='unicode', pretty_print=True))
Указание дополнительных параметров RPC
При использовании Junos RPC PyEZ get_config()
для извлечения конфигурации, он вызывает операцию Junos XML <get-configuration>
. RPC поддерживает аргумент options
, который позволяет включать словарь пар ключей/значений любых атрибутов, поддерживаемых этой операцией <get-configuration>
. Полный список атрибутов, поддерживаемых операцией протокола XML <get-configuration>
Junos см. в < get-configuration>.
Например, get_config()
RPC извлекает данные из конфигурации, пред наследуемой, <groups>
в которой , <apply-groups>
и <apply-groups-except>
<interface-range>
теги являются отдельными элементами в выходных данных конфигурации. Чтобы получить данные из конфигурации после наследование, в которой отображаются утверждения, унаследованные от групп, определяющихся пользователем и диапазонов в качестве потомков унаследованных заявленией, options
можно включить аргумент с 'inherit':'inherit'
.
Например, следующий код извлекает конфигурацию [edit system services]
иерархии на уровне иерархии из конфигурации post-наследование кандидатов. В этом случае, [edit groups global system services]
если конфигурация также содержит утверждения, настроенные на уровне иерархии, [edit system services]
эти утверждения будут унаследованы в иерархии в конфигурации после наследование и возвращены в полученные данные конфигурации.
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='system/services', options={'inherit':'inherit'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
Обработка пространства имен в данных конфигурации
По умолчанию Junos PyEZ get_config()
RPC, в возвращенных данных конфигурации размыкает пространство имен. Junos PyEZ приложения могут сохранять пространство имен в возвращенных данных конфигурации, что позволяет загружать данные обратно на устройство, например, если необходимо быстро изменить существующую конфигурацию.
Чтобы сохранить пространства имен в данных конфигурации, включив remove_ns=False
аргумент в список get_config()
аргументов. Например:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='bgp', model='openconfig', remove_ns=False) print (etree.tostring(data, encoding='unicode', pretty_print=True))
В следующих усеченных выходных данных элемент <bgp>
сохраняет атрибут xmlns
, определяя пространство имен:
<bgp xmlns="http://openconfig.net/yang/bgp"> <neighbors> <neighbor> <neighbor-address>198.51.100.1</neighbor-address> <config> <peer-group>OC</peer-group> <neighbor-address>198.51.100.1</neighbor-address> <enabled>true</enabled> <peer-as>64496</peer-as> </config> </neighbor> </neighbors> ...
Если аргумент get_config()
remove_ns=False
пропущен, пространство имен не будет включено в выходные данные.
<bgp> <neighbors> <neighbor> <neighbor-address>198.51.100.1</neighbor-address> <config> <peer-group>OC</peer-group> <neighbor-address>198.51.100.1</neighbor-address> <enabled>true</enabled> <peer-as>64496</peer-as> </config> </neighbor> </neighbors> ...