Usar la utilidad de configuración de Junos PyEZ para configurar dispositivos Junos
Junos PyEZ le permite realizar cambios de configuración estructurados y no estructurados en dispositivos Junos. En este tema se explica cómo usar la jnpr.junos.utils.config.Config
utilidad para realizar cambios de configuración no estructurados, que consisten en datos de configuración estáticos o con plantillas con formato de texto ASCII, elementos XML de Junos, comandos de Junos OS set
o notación de objetos JavaScript (JSON). La Config
utilidad también le permite revertir a una configuración previamente confirmada o revertir a una configuración de rescate.
Descripción general del proceso de configuración
Después de conectarse correctamente a un dispositivo Junos, para configurar el dispositivo mediante la Config
utilidad, cree primero un Config
objeto y asócielo a la Device
instancia. Por ejemplo:
from jnpr.junos import Device from jnpr.junos.utils.config import Config dev = Device(host='dc1a.example.com').open() cu = Config(dev)
De forma predeterminada, Junos PyEZ actualiza la configuración global candidata (también conocida como base de datos de configuración compartida). El proceso básico para realizar cambios en la configuración consiste en bloquear la base de datos de configuración, cargar los cambios de configuración, confirmar la configuración para activarla y, a continuación, desbloquear la base de datos de configuración. Cuando utilice la utilidad Junos PyEZ Config
para realizar cambios de configuración no estructurados en la base de datos de configuración compartida, puede realizar estas acciones llamando a los métodos de instancia adecuados que se describen aquí:
-
Bloquear la configuración mediante
lock()
-
Modifique la configuración realizando una de las siguientes acciones:
-
Llamada
load()
cuando se carga una nueva configuración completa o se modifican partes específicas de la configuración -
Llamada
rollback()
para revertir a una configuración previamente confirmada, como se describe en Revertir la configuración -
Llamada
rescue()
para cargar la configuración de rescate, como se describe en Cargar la configuración de rescate
-
-
Confirme la configuración mediante
commit()
, como se describe en Confirmar la configuración y utilizar Junos PyEZ para confirmar la configuración -
Desbloquee la configuración mediante
unlock()
También puede utilizar un administrador de contexto (with
... as
sintaxis) para crear una Config
instancia de objeto, y ciertos modos de configuración requieren que utilice uno. Para estos modos, Junos PyEZ bloquea y desbloquea automáticamente la configuración. Para obtener más información, consulte Especificar el modo de configuración.
Cuando utilice el load()
método para modificar la configuración, además de especificar el modo de configuración, también puede especificar el tipo de operación de carga, el formato de los cambios de configuración y el origen de los datos de configuración. La Config
utilidad admite muchas de las mismas operaciones y formatos de carga que están disponibles en la CLI de Junos. Para obtener más información, consulte:
Puede especificar el origen de los datos de configuración como un archivo en el servidor local, un archivo en el dispositivo de destino o un archivo en una dirección URL accesible desde el dispositivo de destino, o como una cadena, un objeto XML o una plantilla Jinja2. Para obtener información acerca de cómo especificar el origen de datos de configuración, consulte las siguientes secciones:
Especificar el modo de configuración
De forma predeterminada, cuando se crea un Config
objeto y no se especifica explícitamente un modo de configuración, Junos PyEZ actualiza la configuración global candidata. También puede especificar un modo de configuración diferente para utilizarlo al modificar la base de datos de configuración. Para especificar un modo distinto del predeterminado, debe crear el Config
objeto mediante un administrador de contexto y establecer el mode
argumento en el modo deseado. Los modos admitidos incluyen private
, exclusive
, dynamic
, batch
, y ephemeral
.
Puede utilizar Junos PyEZ para actualizar la base de datos de configuración efímera en dispositivos compatibles con esta base de datos. 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. 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.
Cuando se especifica un modo distinto del predeterminado, el administrador de contexto se encarga de abrir, bloquear, cerrar y desbloquear la base de datos. Esto garantiza que no abandone involuntariamente la base de datos en un estado bloqueado. En estos casos, solo necesita llamar a los load()
métodos y commit()
para configurar el dispositivo.
Por ejemplo, el código siguiente realiza cambios de configuración mediante el configure private
modo, que abre una copia privada de la configuración candidata:
from jnpr.junos import Device from jnpr.junos.utils.config import Config dev = Device(host='dc1a.example.com').open() with Config(dev, mode='private') as cu: cu.load('set system services netconf traceoptions file test.log', format='set') cu.pdiff() cu.commit() dev.close()
Para obtener más información acerca de los distintos modos de configuración, consulte la Guía del usuario de CLI y Uso de Junos PyEZ para configurar dispositivos Junos.
Especificar la operación de carga
Junos PyEZ admite la carga de cambios de configuración mediante el uso de muchas de las mismas operaciones de carga que se admiten en la CLI de Junos. La operación de carga deseada se especifica incluyendo u omitiendo los parámetros apropiados en el Config
load()
método.
En la tabla 1 se describen las operaciones de carga admitidas y el argumento del método correspondiente load()
. De forma predeterminada, Junos PyEZ realiza una load replace
operación. Para utilizar una operación de carga diferente, establezca el parámetro correspondiente en True
en el load()
método.
Operación de carga |
Argumento |
Descripción |
Primera versión compatible de Junos PyEZ |
---|---|---|---|
|
|
Combine la configuración cargada con la configuración existente. |
1.0 |
|
|
Reemplace toda la configuración por la configuración cargada. |
1.0 |
|
|
Cargue los datos de configuración desde un archivo de revisión. |
2.4.0 |
|
– |
Combine la configuración cargada con la configuración existente, pero reemplace las instrucciones de la configuración existente por aquellas que especifican la |
1.0 |
|
|
Cargue una configuración completa y compárela con la configuración existente. Cada elemento de configuración que es diferente en la configuración cargada reemplaza su elemento correspondiente en la configuración existente. Durante la operación de confirmación, solo los procesos del sistema que se ven afectados por los elementos de configuración modificados analizan la nueva configuración. |
2.1.0 |
En el ejemplo siguiente se realiza una load override
operación, que reemplaza toda la configuración candidata por la configuración cargada y, a continuación, confirma la configuración candidata para activarla.
from jnpr.junos import Device from jnpr.junos.utils.config import Config config_mx = 'configs/junos-config-mx.conf' dev = Device(host='router1.example.com').open() with Config(dev, mode='exclusive') as cu: cu.load(path=config_mx, overwrite=True) cu.commit() dev.close()
Especifique el formato de los datos de configuración que se van a cargar
La utilidad Junos PyEZ Config
le permite configurar dispositivos Junos mediante uno de los formatos estándar compatibles. Puede proporcionar datos de configuración como cadenas, archivos, objetos XML u objetos de plantilla Jinja2. Los archivos pueden contener fragmentos de datos de configuración o plantillas Jinja2. Al proporcionar datos de configuración dentro de una cadena, archivo o plantilla Jinja2, los formatos admitidos para los datos incluyen texto ASCII, elementos XML de Junos, comandos de Junos OS set
y JSON. Puede especificar el formato de los datos de configuración incluyendo explícitamente el format
parámetro en el método de Config
utilidad load()
o agregando la extensión adecuada al archivo de datos de configuración. Si no especifica un formato, el valor predeterminado es XML.
A partir de Junos PyEZ versión 1.2, Junos PyEZ detecta automáticamente el formato cuando proporciona los datos de configuración como una cadena.
En la tabla 2 se resumen los formatos admitidos para los datos de configuración y el valor correspondiente para la extensión format
y el parámetro del archivo. Cuando utilice el formato XML de Junos para los datos de configuración, debe encerrar los datos en la etiqueta de nivel <configuration>
superior.
No es necesario incluir datos de configuración con formato de texto ASCII, comandos de Junos OS set
o JSON en <configuration-text>
, ni <configuration-json>
etiquetas, <configuration-set>
según sea necesario, al configurar el dispositivo directamente dentro de una sesión de NETCONF.
Formato de datos de configuración |
Extensión de archivo |
parámetro format |
---|---|---|
Texto ASCII |
.conf, .text .txt |
Texto |
Notación de objetos JavaScript (JSON) |
.Json |
Json |
Comandos de Junos OS |
.Establecer |
Establecer |
Elementos XML de Junos |
.Xml |
Xml |
Cuando el overwrite
parámetro or update
se establece en True
, no puede utilizar el formato de comando de Junos OS set
.
Los dispositivos que ejecutan Junos OS versión 16.1R1 o posterior admiten la carga de datos de configuración en formato JSON.
Especifique la ubicación de los datos de configuración
Junos PyEZ permite cargar datos de configuración como cadenas, archivos, objetos XML u objetos de plantilla Jinja2. Los archivos pueden contener fragmentos de datos de configuración o plantillas Jinja2.
En la tabla 3 se resumen los parámetros del load()
método que se utilizan para pasar los datos de configuración o hacer referencia a su ubicación. Siempre debe especificar el formato de los datos incluyendo el format
parámetro en la llamada al método, excepto cuando se utilizan cadenas, objetos XML o archivos que tienen el formato indicado por la extensión de archivo. Cuando utilice plantillas Jinja2, incluya el template_vars
parámetro que desea pasar en el diccionario de variables de plantilla requeridas.
Parámetro |
Origen de datos de configuración |
Descripción |
|
---|---|---|---|
|
Archivo local |
Ruta a un archivo en el servidor de administración de configuración local que contiene datos de configuración formateados como texto ASCII, elementos XML de Junos, comandos de Junos OS |
Debe incluir el |
|
Jinja2 Objeto Template |
Objeto de plantilla Jinja2 precargado. Incluya el |
Debe incluir el |
|
Archivo de plantilla Jinja2 local |
Ruta a un archivo en el servidor de administración de configuración local que contiene una plantilla Jinja2 con formato de texto ASCII, elementos XML de Junos, comandos de Junos OS Incluya el |
Debe incluir el |
|
Archivo remoto |
Ruta a un archivo ubicado en el dispositivo Junos o en una URL remota a la que se puede acceder desde el dispositivo Junos mediante una dirección URL FTP o de Protocolo de transferencia de hipertexto (HTTP). |
Debe incluir el |
|
Objeto XML Cadena |
Objeto XML o una cadena que contenga datos de configuración con formato de texto ASCII, elementos XML de Junos, comandos de Junos OS |
Junos PyEZ detecta automáticamente el formato de los datos de configuración en este caso, y el |
Cargar datos de configuración desde un archivo local o remoto
Junos PyEZ le permite cargar datos de configuración formateados como texto ASCII, elementos XML de Junos, comandos de Junos OS set
o JSON desde un archivo local o remoto.
Para cargar datos de configuración desde un archivo local en el servidor de administración de configuración, establezca el load()
parámetro del path
método en la ruta absoluta o relativa del archivo. Por ejemplo:
from jnpr.junos import Device from jnpr.junos.utils.config import Config dev = Device(host='dc1a.example.com').open() conf_file = 'configs/junos-config-interfaces.conf' with Config(dev, mode='exclusive') as cu: cu.load(path=conf_file, merge=True) cu.commit() dev.close()
También puede cargar datos de configuración desde un archivo ubicado en el dispositivo Junos o en una URL accesible desde el dispositivo Junos. Para cargar datos de configuración desde un archivo en el dispositivo Junos, establezca el url
parámetro en la ruta absoluta o relativa del archivo en el dispositivo de destino e incluya cualquier otro parámetro necesario para la operación de carga. Por ejemplo:
cu.load(url='/var/home/user/golden.conf')
url
parámetro en la ubicación FTP o la dirección URL del Protocolo de transferencia de hipertexto (HTTP) de un archivo remoto e incluya cualquier otro parámetro necesario para la operación de carga. Por ejemplo:
cu.load(url='ftp://username@ftp.hostname.net/path/filename')
cu.load(url='http://username:password@example.com/path/filename')
Para obtener información detallada acerca de cómo especificar la dirección URL, consulte el atributo de url
la operación del protocolo XML de Junos <load-configuration> .
Si el archivo no indica el formato de los datos de configuración mediante una de las extensiones de archivo aceptadas enumeradas en Especificar el formato de los datos de configuración que se van a cargar, debe especificar el formato incluyendo el format
parámetro en la load()
lista de parámetros del método. Por ejemplo:
conf_file = 'configs/junos-config-interfaces' cu.load(path=conf_file, format='text', merge=True)
Para obtener información sobre cómo cargar datos de configuración desde plantillas Jinja2 o archivos de plantilla , consulte Cargar datos de configuración mediante plantillas Jinja2.
Cargar datos de configuración desde una cadena
Para cargar datos de configuración con formato de texto ASCII, elementos XML de Junos, comandos de Junos OS set
o JSON desde una cadena, incluya la cadena como primer argumento en la lista de argumentos de método load()
. Junos PyEZ detecta automáticamente el formato de los datos de configuración en cadenas, por lo que el format
parámetro es opcional en este caso.
Los siguientes fragmentos de código presentan cadenas multilínea de ejemplo que contienen datos de configuración en los distintos formatos y las llamadas correspondientes al load()
método. El parámetro opcional format
se incluye explícitamente en cada ejemplo para mayor claridad. En los ejemplos, cu
es una instancia de la Config
utilidad, que funciona en el dispositivo Junos de destino.
from jnpr.junos import Device from jnpr.junos.utils.config import Config dev = Device(host='dc1a.example.com').open() cu = Config(dev)
Para datos de configuración formateados como texto ASCII:
config_text = """ system { scripts { op { file test.slax; } } } """
Cargue los datos de configuración proporcionando la cadena como primer argumento de la lista y, opcionalmente, especifique
format="text"
.cu.load(config_text, format='text', merge=True)
Para datos de configuración con formato Junos XML:
config_xml = """ <configuration> <system> <scripts> <op> <file> <name>test.slax</name> </file> </op> </scripts> </system> </configuration> """
Cargue los datos de configuración proporcionando la cadena como primer argumento de la lista y, opcionalmente, especifique
format="xml"
.cu.load(config_xml, format='xml', merge=True)
Para los datos de configuración formateados como comandos de Junos OS
set
:config_set = """ set system scripts op file test.slax """
Cargue los datos de configuración proporcionando la cadena como primer argumento de la lista y, opcionalmente, especifique
format="set"
.cu.load(config_set, format='set', merge=True)
Para datos de configuración formateados con JSON:
config_json = """{ "configuration" : { "system" : { "scripts" : { "op" : { "file" : [ { "name" : "test.slax" } ] } } } } }"""
Cargue los datos de configuración proporcionando la cadena como primer argumento de la lista y, opcionalmente, especifique
format="json"
.cu.load(config_json, format='json', merge=True)
Cargar datos de configuración formateados como un objeto XML
Para cargar datos de configuración con formato de objeto XML, incluya el objeto como primer argumento en la lista de argumentos de método load()
y proporcione cualquier otro parámetro necesario. Dado que el formato predeterminado para los datos de configuración es XML, no es necesario incluir explícitamente el format
parámetro en la llamada al método.
El código siguiente presenta un objeto XML y la llamada correspondiente al load()
método:
from jnpr.junos import Device from jnpr.junos.utils.config import Config from lxml.builder import E config_xml_obj = ( E.configuration( # create an Element called "configuration" E.system( E.scripts( E.op ( E.file ( E.name("test.slax"), ) ) ) ) ) ) with Device(host='dc1a.example.com') as dev: with Config(dev, mode='exclusive') as cu: cu.load(config_xml_obj, merge=True) cu.commit()
Cargar datos de configuración con plantillas Jinja2
Junos PyEZ admite el uso de plantillas Jinja2 para representar los datos de configuración de Junos. Jinja es un motor de plantillas para Python que le permite generar documentos a partir de plantillas predefinidas. Las plantillas, que son archivos de texto en el idioma deseado, proporcionan flexibilidad mediante el uso de expresiones y variables. Puede crear datos de configuración de Junos mediante plantillas Jinja2 en uno de los formatos de configuración compatibles, que incluyen texto ASCII, elementos XML de Junos, comandos de Junos OS set
y JSON. Junos PyEZ utiliza la plantilla Jinja2 y un diccionario de variables suministrado para representar los datos de configuración.
Las plantillas Jinja2 proporcionan un método eficaz para generar datos de configuración, especialmente para estrofas de configuración similares. Por ejemplo, en lugar de agregar manualmente las mismas instrucciones de configuración para cada interfaz de un dispositivo, puede crear una plantilla que recorra en iteración una lista de interfaces y cree las instrucciones de configuración necesarias para cada una. En Jinja, los bloques están delimitados por '{%
' y '' y las%}
variables están encerradas dentro de '{{
' y '}}
'.
La siguiente plantilla Jinja2 de ejemplo genera datos de configuración que habilitan MPLS en la unidad lógica 0 para cada interfaz en una lista determinada y también configura la interfaz bajo los protocolos MPLS y RSVP.
interfaces { {% for item in interfaces %} {{ item }} { description "{{ description }}"; unit 0 { family {{ family }}; } } {% endfor %} } protocols { mpls { {% for item in interfaces %} interface {{ item }}; {% endfor %} } rsvp { {% for item in interfaces %} interface {{ item }}; {% endfor %} } }
En el código de Junos PyEZ, el diccionario correspondiente de variables de plantilla Jinja2 es:
config_vars = { 'interfaces': ['ge-1/0/1', 'ge-1/0/2', 'ge-1/0/3'], 'description': 'MPLS interface', 'family': 'mpls' }
Para cargar la plantilla Jinja2 en el código de Junos PyEZ, establezca el template_path
parámetro en la ruta del archivo de plantilla y establezca el template_vars
parámetro en el diccionario de variables de plantilla. Si no utiliza una de las extensiones de archivo aceptadas para indicar el formato de los datos de configuración, debe incluir el format
parámetro en la lista de parámetros del load()
método.
from jnpr.junos import Device from jnpr.junos.utils.config import Config conf_file = 'configs/junos-config-interfaces-mpls.conf' config_vars = { 'interfaces': ['ge-1/0/1', 'ge-1/0/2', 'ge-1/0/3'], 'description': 'MPLS interface', 'family': 'mpls' } with Device(host='router1.example.com') as dev: with Config(dev, mode='exclusive') as cu: cu.load(template_path=conf_file, template_vars=config_vars, merge=True) cu.commit()
Si va a proporcionar un objeto Template Jinja2 precargado, debe utilizar el template
parámetro en lugar del parámetro de la lista de load()
argumentos del template_path
método.
Junos PyEZ utiliza la plantilla Jinja2 y el diccionario de variables para representar los siguientes datos de configuración, que luego se cargan en la configuración candidata y se confirman en el dispositivo:
interfaces { ge-1/0/1 { description "MPLS interface"; unit 0 { family mpls; } } ge-1/0/2 { description "MPLS interface"; unit 0 { family mpls; } } ge-1/0/3 { description "MPLS interface"; unit 0 { family mpls; } } } protocols { mpls { interface ge-1/0/1; interface ge-1/0/2; interface ge-1/0/3; } rsvp { interface ge-1/0/1; interface ge-1/0/2; interface ge-1/0/3; } }
El siguiente video presenta una breve sesión de Python que muestra cómo usar una plantilla Jinja2 para configurar un dispositivo Junos.
Para obtener información adicional acerca de Jinja2, consulte la documentación de Jinja2 en https://jinja.pocoo.org/docs/.
Revertir la configuración
Los dispositivos Junos almacenan una copia de la configuración confirmada más reciente y hasta 49 configuraciones anteriores, dependiendo de la plataforma. Puede revertir a cualquiera de las configuraciones almacenadas. Esto resulta útil cuando los cambios en la configuración provocan resultados no deseados y desea volver a una configuración de trabajo conocida. La reversión de la configuración es similar al proceso para realizar cambios de configuración en el dispositivo, pero en lugar de cargar los datos de configuración, se realiza una reversión, que reemplaza toda la configuración candidata por una configuración confirmada anteriormente.
El método de clase rollback()
PyEZ jnpr.junos.utils.config.Config
de Junos permite revertir la configuración en un dispositivo Junos. Para revertir la configuración, llame rollback()
al método y establezca el rb_id
argumento en el identificador de la configuración de reversión. Los valores de ID válidos son 0 (cero, para la configuración confirmada más recientemente) a través de uno menos que el número de configuraciones anteriores almacenadas (el máximo es 49). Si omite este parámetro en la llamada al método, el valor predeterminado es 0.
En el ejemplo siguiente se solicita el identificador de reversión de la configuración que se va a restaurar, se revierte la configuración, se imprimen las diferencias de configuración y, a continuación, se confirma la configuración para convertirla en la configuración activa en el dispositivo.
from jnpr.junos import Device from jnpr.junos.utils.config import Config rollback_id = int(input('Rollback ID of the configuration to restore: ')) with Device(host='dc1a.example.com') as dev: with Config(dev, mode='exclusive') as cu: cu.rollback(rb_id=rollback_id) cu.pdiff() cu.commit()
user@server:~$ python3 junos-pyez-rollback.py Rollback ID of the configuration to restore: 1 [edit interfaces] - ge-0/0/1 { - unit 0 { - family inet { - address 198.51.100.1/24; - } - } - }
Para ver un ejemplo más amplio que incluye el control de errores, consulte Ejemplo: uso de Junos PyEZ para revertir la configuración.
Cargar la configuración de rescate
Una configuración de rescate le permite definir una configuración de trabajo conocida o una configuración con un estado conocido que puede restaurar en cualquier momento. Utilice la configuración de rescate cuando necesite volver a una configuración conocida o como último recurso si la configuración del enrutador o conmutador y los archivos de configuración de copia de seguridad se dañan sin posibilidad de reparación. Cuando se crea una configuración de rescate, el dispositivo guarda la configuración confirmada más reciente como configuración de rescate.
La utilidad Junos PyEZ jnpr.junos.utils.config.Config
le permite administrar la configuración de rescate en dispositivos Junos. Después de crear una instancia de la Config
clase, utilice el rescue()
método para administrar la configuración de rescate. Para especificar la acción que se va a realizar en la configuración de rescate, establezca el rescue()
parámetro method action
en la operación deseada.
Para cargar la configuración de rescate existente en la configuración candidata, especifique action="reload"
. Si no existe ninguna configuración de rescate, la operación de carga devuelve False
. Después de cargar la configuración de rescate, debe confirmar la configuración para convertirla en la configuración activa en el dispositivo.
En el ejemplo siguiente se carga y confirma la configuración de rescate, si existe:
from jnpr.junos import Device from jnpr.junos.utils.config import Config with Device(host='dc1a.example.com') as dev: with Config(dev, mode='exclusive') as cu: rescue = cu.rescue(action='reload') if rescue is False: print ('No existing rescue configuration.') else: cu.pdiff() cu.commit()
Para obtener información sobre cómo crear, recuperar o eliminar la configuración de rescate y ejemplos adicionales, consulte Usar Junos PyEZ para administrar la configuración de rescate en dispositivos Junos.
Confirmar la configuración
Después de modificar la configuración, debe confirmar la configuración para convertirla en la configuración activa en el dispositivo. Cuando se utiliza la Config
utilidad para realizar cambios de configuración no estructurados en un dispositivo, se confirma la configuración candidata llamando al commit()
método.
from jnpr.junos import Device from jnpr.junos.utils.config import Config conf_file = 'configs/junos-config-interfaces.conf' with Device(host='dc1a.example.com') as dev: with Config(dev, mode='exclusive') as cu: cu.load(path=conf_file, merge=True) cu.commit()
Para obtener más información acerca de la operación de confirmación y las opciones de confirmación admitidas en scripts de Junos PyEZ, consulte Uso de Junos PyEZ para confirmar la configuración.
Tabla de historial de cambios
La compatibilidad con las funciones viene determinada por la plataforma y la versión que esté utilizando. Utilice el Explorador de características para determinar si una característica es compatible con su plataforma.