EN ESTA PÁGINA
Usar Junos PyEZ para recuperar una configuración
RESUMEN Puede crear aplicaciones de Junos PyEZ que recuperen datos de configuración de la base de datos de configuración especificada en un dispositivo Junos.
Las aplicaciones de Junos PyEZ pueden ejecutar llamadas a procedimiento remoto (RPC) a pedido en dispositivos Junos. Después de crear una instancia de la Device
clase, una aplicación puede ejecutar RPC como una propiedad de la Device
instancia. Las aplicaciones de Junos PyEZ pueden usar RPC get_config()
para solicitar la configuración completa o partes seleccionadas de la configuración tanto para la configuración nativa de Junos OS como para los datos de configuración correspondientes a modelos de datos YANG estándar (IETF, OpenConfig) o personalizados que se hayan agregado al dispositivo.
La RPC de Junos PyEZ get_config
invoca la operación del protocolo <get-configuration>
XML de Junos. Para obtener más información acerca de la <get-configuration>
operación y sus opciones, consulte <get-configuration>.
En este tema se explica cómo recuperar la configuración mediante Junos PyEZ get_config()
RPC. Para obtener información acerca del uso de tablas y vistas para recuperar datos de configuración, consulte Definir tablas de configuración de Junos PyEZ y Usar tablas de configuración de Junos PyEZ para recuperar datos de configuración.
Recuperar la configuración candidata completa
Para recuperar la configuración candidata completa de un dispositivo Junos, ejecute la get_config()
RPC. El formato de salida predeterminado es XML. Por ejemplo:
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))
Especificar la base de datos de origen para los datos de configuración
Cuando una aplicación de Junos PyEZ utiliza RPC get_config()
para recuperar información de configuración de un dispositivo Junos, de forma predeterminada, el servidor devuelve datos de la base de datos de configuración candidata. Una aplicación de Junos PyEZ también puede recuperar datos de configuración de la base de datos de configuración confirmada o de la base de datos de configuración efímera.
Base de datos de configuración candidata
Para recuperar datos de la base de datos de configuración candidata, ejecute el get_config()
RPC y, opcionalmente, incluya cualquier argumento adicional.
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))
Base de datos de configuración confirmada
Para recuperar datos de la base de datos de configuración confirmada, incluya el options
argumento con 'database':'committed'
en la get_config()
llamada 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))
Base de datos de configuración efímera
Junos PyEZ admite operaciones en la base de datos de configuración efímera en dispositivos que admiten esta base de datos. Cuando se recuperan datos de configuración de la base de datos de configuración compartida, de forma predeterminada, los resultados no incluyen datos de la base de datos de configuración efímera.
La base de datos efímera es una base de datos de configuración alternativa que proporciona una interfaz programática rápida para realizar actualizaciones de configuración en dispositivos Junos. La base de datos de configuración efímera es una característica avanzada que, si se usa incorrectamente, puede tener un grave impacto negativo en el funcionamiento del dispositivo. Para obtener más información, vea Descripción de la base de datos de configuración efímera.
Para recuperar datos de la instancia predeterminada de la base de datos de configuración efímera, abra primero la instancia efímera predeterminada y, a continuación, solicite los datos. Para abrir la instancia predeterminada, utilice un administrador de contexto para crear la Config
instancia e incluya el mode='ephemeral'
argumento. Por ejemplo:
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)
Para recuperar datos de una instancia específica de la base de datos de configuración efímera, abra primero la instancia efímera y, a continuación, solicite los datos. Para abrir una instancia definida por el usuario de la base de datos de configuración efímera, utilice un administrador de contexto para crear la Config
instancia, incluya el mode='ephemeral'
argumento y establezca el ephemeral_instance
argumento en el nombre de la instancia efímera.
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)
Especifique el ámbito de los datos de configuración que se devolverán
Además de recuperar la configuración completa de Junos OS, una aplicación de Junos PyEZ puede recuperar partes específicas de la configuración invocando el get_config()
RPC con el filter_xml
argumento. El filter_xml
parámetro toma una cadena que contiene el filtro de subárbol que selecciona las instrucciones de configuración que se van a devolver. El filtro de subárbol devuelve los datos de configuración que coinciden con los criterios de selección.
Para solicitar varias jerarquías, la filter_xml
cadena debe incluir el <configuration>
elemento raíz. De lo contrario, el valor de filter_xml
debe representar todos los niveles de la jerarquía de configuración, comenzando justo debajo del elemento raíz <configuration>
hasta la jerarquía que se va a mostrar. Para seleccionar un subárbol, incluya la etiqueta vacía para ese nivel de jerarquía. Para devolver un objeto específico, incluya un nodo de coincidencia de contenido que defina el elemento y el valor que se van a coincidir.
La siguiente aplicación de Junos PyEZ recupera e imprime la configuración en los niveles de [edit interfaces]
jerarquía y [edit protocols]
en la configuración candidata:
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))
En el ejemplo siguiente se recupera e imprime la configuración en el nivel de [edit system services]
jerarquía utilizando valores diferentes pero equivalentes para el filter_xml
argumento:
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))
En el ejemplo siguiente se recupera el <name>
elemento para cada <interface>
elemento de la <interfaces>
jerarquía en la configuración del candidato posterior a la herencia:
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>
En el ejemplo siguiente se recupera el subárbol de la interfaz 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>
Especificar el formato de los datos de configuración que se devolverán
El RPC de Junos PyEZ get_config()
invoca la operación del protocolo <get-configuration>
XML de Junos, que puede devolver datos de configuración de Junos OS como elementos XML de Junos, instrucciones de configuración de CLI, comandos de Junos OS set
o notación de objetos JavaScript (JSON). De forma predeterminada, la RPC devuelve los datos de get_config()
configuración como XML.
Para especificar el formato en el que devolver los datos de configuración, la aplicación Junos PyEZ incluye el options
diccionario con 'format':'format'
en la lista de get_config()
argumentos. Para solicitar instrucciones de configuración de CLI, comandos de Junos OS set
o formato JSON, establezca el format
valor en text
, set
, o json
, respectivamente.
Al igual que en las sesiones de protocolo XML de NETCONF y Junos, Junos PyEZ devuelve los datos de configuración en el formato esperado encerrado dentro del elemento XML apropiado para ese formato. La respuesta RPC incluye datos de configuración en formatos XML, texto o set
comando en <configuration>
, <configuration-text>
y <configuration-set>
elementos, respectivamente.
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)
Dependiendo de la versión de Python y el formato de la salida, es posible que deba modificar la instrucción print para mostrar una salida más legible por humanos.
Recuperar datos de configuración para modelos de datos YANG estándar o personalizados
Puede cargar módulos YANG estandarizados o personalizados en dispositivos Junos para agregar modelos de datos que no son compatibles de forma nativa con Junos OS, pero que pueden ser compatibles con la traducción. Los modelos de datos no nativos se configuran en la configuración candidata mediante la sintaxis definida para dichos modelos. Al confirmar la configuración, los scripts de traducción del modelo de datos traducen esos datos y confirman la configuración correspondiente de Junos OS como un cambio transitorio en la configuración de retirada.
Las configuraciones candidatas y activas contienen los datos de configuración de los modelos de datos de YANG no nativos en la sintaxis definida por esos modelos. Las aplicaciones Junos PyEZ pueden recuperar datos de configuración para modelos de datos YANG estándar y personalizados, además de recuperar la configuración nativa de Junos OS incluyendo los argumentos adecuados en el get_config()
RPC. De forma predeterminada, los datos de configuración no nativos no se incluyen en la respuesta RPC get_config()
.
Para recuperar datos de configuración definidos por un modelo de datos de YANG no nativo, además de recuperar la configuración de Junos OS, ejecute la get_config()
RPC con el model
argumento e incluya el namespace
argumento cuando corresponda. El model
argumento toma uno de los siguientes valores:
custom
: recupera datos de configuración definidos por modelos de datos YANG personalizados. Debe incluir elnamespace
argumento al recuperar datos para modelos de datos YANG personalizados.ietf
: recupera datos de configuración definidos por los modelos de datos de YANG de IETF.openconfig
: recupera datos de configuración definidos por los modelos de datos YANG de OpenConfig.True
: recupera todos los datos de configuración, incluida la configuración completa de Junos OS y los datos de cualquier modelo de datos de YANG.
Si especifica el ietf
valor o openconfig
para el model
argumento, Junos PyEZ utiliza automáticamente el espacio de nombres adecuado. Si recupera datos para un modelo de datos YANG personalizado mediante model='custom'
, también debe incluir el namespace
argumento con el espacio de nombres correspondiente.
Si incluye el model
argumento con el valor custom
, ietf
o openconfig
también incluye el filter_xml
argumento para devolver un subárbol XML específico, Junos OS solo devuelve la jerarquía coincidente del modelo de datos no nativo. Si la configuración de Junos OS contiene una jerarquía del mismo nombre, por ejemplo "interfaces", no se incluye en la respuesta. La filter_xml
opción no se admite cuando se utiliza model=True
.
En el ejemplo siguiente, RPC get_config()
recupera la jerarquía de configuración de OpenConfig bgp
de la configuración candidata en el dispositivo. Si omite el filter_xml
argumento, RPC devuelve las configuraciones candidatas completas de Junos OS y OpenConfig.
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))
El siguiente RPC recupera la interfaces
jerarquía de configuración de la configuración candidata para un modelo de datos de YANG de IETF:
data = dev.rpc.get_config(filter_xml='interfaces', model='ietf') print (etree.tostring(data, encoding='unicode', pretty_print=True))
El siguiente RPC recupera la l2vpn
jerarquía de configuración de la configuración candidata para un modelo de datos YANG personalizado con el espacio de nombres especificado:
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))
El siguiente RPC recupera la configuración completa del candidato de Junos OS, así como los datos de configuración de otros modelos de datos de YANG que se agregaron al dispositivo:
data = dev.rpc.get_config(model=True) print (etree.tostring(data, encoding='unicode', pretty_print=True))
Especificar opciones de RPC adicionales
Cuando se utiliza Junos PyEZ get_config()
RPC para recuperar la configuración, se invoca la operación de protocolo <get-configuration>
XML de Junos. El RPC admite el options
argumento, que permite incluir un diccionario de pares clave/valor de cualquier atributo admitido por la <get-configuration>
operación. Para obtener la lista completa de atributos admitidos por la operación del protocolo <get-configuration>
XML de Junos, consulte <get-configuration>.
Por ejemplo, el get_config()
RPC recupera datos de la configuración previa a la herencia, en la que las <groups>
etiquetas , <apply-groups>
<apply-groups-except>
, y <interface-range>
son elementos independientes en la salida de la configuración. Para recuperar datos de la configuración posterior a la herencia, que muestra instrucciones heredadas de grupos y rangos definidos por el usuario como elementos secundarios de las instrucciones heredadas, puede incluir el options
argumento con 'inherit':'inherit'
.
Por ejemplo, el código siguiente recupera la configuración en el nivel de jerarquía de la configuración candidata posterior a la [edit system services]
herencia. En este caso, si la configuración también contiene instrucciones configuradas en el nivel de jerarquía, dichas instrucciones se heredarán bajo la [edit system services]
jerarquía en la configuración posterior a la [edit groups global system services]
herencia y se devolverán en los datos de configuración recuperados.
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))
Cómo manejar espacios de nombres en datos de configuración
De forma predeterminada, Junos PyEZ get_config()
RPC elimina todos los espacios de nombres en los datos de configuración devueltos. Las aplicaciones de Junos PyEZ pueden conservar el espacio de nombres en los datos de configuración devueltos, lo que le permite volver a cargar los datos en un dispositivo, por ejemplo, cuando desea modificar rápidamente la configuración existente.
Para conservar espacios de nombres en los datos de configuración, incluya el remove_ns=False
argumento en la lista de get_config()
argumentos. Por ejemplo:
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))
En la siguiente salida truncada, el <bgp>
elemento conserva el xmlns
atributo que define el espacio de nombres:
<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> ...
Si se omite el get_config()
remove_ns=False
argumento, el espacio de nombres no se incluye en el resultado.
<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> ...