Ejemplo: Generar cambios de configuración persistentes y transitorios mediante scripts de confirmación
Ejemplo: Generar un cambio persistente
Los scripts de confirmación de Junos OS permiten a los usuarios personalizar el proceso de validación de sus configuraciones de acuerdo con sus propias prácticas y políticas, y aplicar reglas de configuración personalizadas durante el proceso de confirmación. En este ejemplo, se muestra una secuencia de comandos de confirmación que genera un cambio persistente que agrega la family mpls
instrucción en la configuración de interfaces SONET/SDH cuando la instrucción no está ya incluida en la configuración. Si no configura explícitamente la familia de protocolos MPLS en una interfaz, la interfaz no está habilitada para aplicaciones MPLS.
Requisitos
En este ejemplo, se utilizan los siguientes componentes de hardware y software:
Dispositivo que ejecuta Junos OS con una o más interfaces SONET/SDH.
Junos OS versión 16.1R3 o posterior cuando se utiliza una secuencia de comandos de Python.
Descripción general y script de confirmación
La secuencia de comandos de confirmación de este ejemplo encuentra todas las interfaces SONET/SDH que tienen una interfaz lógica configurada pero que no tienen la family mpls
instrucción configurada. Para estas interfaces, el script agrega la family mpls
instrucción a la configuración de interfaz como un cambio persistente en el [edit interfaces interface-name unit logical-unit-number]
nivel de jerarquía. El script se muestra en SLAX, XSLT y Python.
Las versiones SLAX y XSLT de la secuencia de comandos de confirmación generan el cambio persistente mediante el uso de la jcs:emit-change
plantilla, que es una plantilla auxiliar contenida en el archivo de importación junos.xsl . Se tag
omite el parámetro de la jcs:emit-change
plantilla, lo que dirige la secuencia de comandos a emitir el cambio como un cambio persistente. El content
parámetro de la jcs:emit-change
plantilla incluye las instrucciones de configuración que se agregarán como cambio persistente. El message
parámetro de la jcs:emit-change
plantilla incluye el mensaje de advertencia que se mostrará en la CLI, notificándolo de que la configuración ha cambiado.
La versión Python de la secuencia de comandos de confirmación genera el cambio persistente mediante el uso de la jcs.emit_change()
función, que se importa desde el jcs
módulo. La secuencia de comandos de Python indica que se trata de un cambio persistente al pasar en el argumento posicionacional 'change'.
Sintaxis XSLT
<?xml version="1.0" standalone="yes"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:junos="http://xml.juniper.net/junos/*/junos" xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm" xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0"> <xsl:import href="../import/junos.xsl"/> <xsl:template match="configuration"> <xsl:for-each select="interfaces/interface[starts-with(name, 'so-')]/unit"> <xsl:if test="not(family/mpls)"> <xsl:call-template name="jcs:emit-change"> <xsl:with-param name="message"> <xsl:text>Adding 'family mpls' to SONET/SDH interface.</xsl:text> </xsl:with-param> <xsl:with-param name="content"> <family> <mpls/> </family> </xsl:with-param> </xsl:call-template> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Sintaxis SLAX
version 1.0; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; import "../import/junos.xsl"; match configuration { for-each (interfaces/interface[starts-with(name, 'so-')]/unit) { if (not(family/mpls)) { call jcs:emit-change() { with $message = { expr "Adding 'family mpls' to SONET/SDH interface."; } with $content = { <family> { <mpls>; } } } } } }
Sintaxis de Python
from junos import Junos_Configuration import jcs def main(): # Get configuration root object root = Junos_Configuration for element in root.xpath("./interfaces/ \ interface[starts-with(name,'so-')]/unit"): if element.find('family/mpls') is None: if_name = element.find('../name').text unit_name = element.find('name').text change_xml = """ <interfaces> <interface> <name>{0}</name> <unit> <name>{1}</name> <family> <mpls> </mpls> </family> </unit> </interface> </interfaces> """.format(if_name, unit_name).strip() jcs.emit_change(change_xml, "change", "xml") jcs.emit_warning("Adding 'family mpls' to SONET/SDH interface: " + if_name) if __name__ == '__main__': main()
Configuración
Procedimiento
Procedimiento paso a paso
Para descargar, habilitar y probar la secuencia de comandos.
Copie el script en un archivo de texto, asigne un nombre al archivo mpls.xsl, mpls.slax o mpls.py según corresponda, y cópielo en el directorio /var/db/scripts/commit/ del dispositivo.
Nota:Los scripts de Python sin firma deben ser propiedad de la raíz o de un usuario de la clase de inicio de sesión de Junos OS
super-user
, y solo el propietario del archivo puede tener permiso de escritura para el archivo.En el modo de configuración, configure la
file
instrucción y el nombre de archivo de secuencia de comandos en el[edit system scripts commit]
nivel de jerarquía.[edit] user@host# set system scripts commit file mpls.xsl
Si el script está escrito en Python, habilite la ejecución de scripts de Python sin firmar.
[edit] user@host# set system scripts language python
Nota:Configure la
language python3
instrucción para usar Python 3 para ejecutar scripts de Python, o configure lalanguage python
instrucción para usar Python 2.7 para ejecutar scripts de Python. Para obtener más información, consulte idioma.Para probar que la secuencia de comandos de confirmación genera el cambio persistente correctamente, asegúrese de que la configuración contiene la condición que provoca el cambio. Para probar este script, asegúrese de que la
family mpls
instrucción no se incluye en el[edit interfaces so-fpc/pic/port unit logical-unit-number]
nivel de jerarquía para al menos una interfaz SONET/SDH.Emita el
commit check
comando para previsualizar un seguimiento del procesamiento de script de confirmación para comprobar que la secuencia de comandos agregará el cambio persistente a la configuración del candidato. Elcommit check
comando verifica la sintaxis de la configuración antes de una confirmación, pero no confirma los cambios.La secuencia de comandos de confirmación de este ejemplo genera un mensaje para cada cambio que hace. Utilice el
commit check
comando para previsualizar estos mensajes para determinar si el script actualizará la configuración con lafamily mpls
instrucción para las interfaces adecuadas.Emita el
commit check | display xml
comando para mostrar la versión del mensaje con formato XML. El resultado de ejemplo indica que el script agregará lafamily mpls
instrucción a la configuración de interfaz so-2/3/4.0 durante la operación de confirmación.[edit] user@host# commit check | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/11.2R1/junos"> <commit-results> <routing-engine junos:style="normal"> <name>re0</name> <xnm:warning xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm"> <edit-path> [edit interfaces interface so-2/3/4 unit 0] </edit-path> <message> Adding 'family mpls' to SONET/SDH interface. </message> </xnm:warning> <commit-check-success/> </routing-engine> </commit-results> </rpc-reply>
Para mostrar un seguimiento detallado del procesamiento de scripts de confirmación, emita el
commit check | display detail
comando. En la salida de muestra, hay un cambio persistente que se cargará en la configuración durante la operación de confirmación.[edit] user@host# commit check | display detail 2011-06-17 14:17:35 PDT: reading commit script configuration 2011-06-17 14:17:35 PDT: testing commit script configuration 2011-06-17 14:17:35 PDT: opening commit script '/var/db/scripts/commit/mpls.xsl' 2011-06-17 14:17:35 PDT: reading commit script 'mpls.xsl' 2011-06-17 14:17:35 PDT: running commit script 'mpls.xsl' 2011-06-17 14:17:35 PDT: processing commit script 'mpls.xsl' 2011-06-17 14:17:35 PDT: no errors from mpls.xsl 2011-06-17 14:17:35 PDT: saving commit script changes for script mpls.xsl 2011-06-17 14:17:35 PDT: summary of script mpls.xsl: changes 1, transients 0, syslog 0 2011-06-17 14:17:35 PDT: start loading commit script changes 2011-06-17 14:17:35 PDT: loading commit script changes into real db 2011-06-17 14:17:35 PDT: finished commit script changes into real db 2011-06-17 14:17:35 PDT: no transient commit script changes 2011-06-17 14:17:35 PDT: finished loading commit script changes 2011-06-17 14:17:35 PDT: copying juniper.db to juniper.data+ 2011-06-17 14:17:35 PDT: finished copying juniper.db to juniper.data+ ... configuration check succeeds
Después de comprobar que la secuencia de comandos produce los cambios correctos, emita el
commit
comando para iniciar la operación de confirmación y ejecutar el script.user@host# commit
Verificación
Verificar la configuración
Propósito
Compruebe que los cambios correctos están integrados en la configuración.
Acción
Después de ejecutar la operación de confirmación, vea la configuración mediante la emisión del comando del modo de show interfaces
configuración. Si la familia de protocolos MPLS no está habilitada en una o más interfaces SONET/SDH antes de que se ejecute la secuencia de comandos, el resultado es similar al siguiente:
[edit] user@host# show interfaces ... other configured interface types ... so-2/3/4 { unit 0 { family mpls; # Added by persistent change } } ... other configured interface types ...
Ejemplo: Generar un cambio transitorio
En este ejemplo, se usa una secuencia de comandos de confirmación para establecer la encapsulación PPP en todas las interfaces SONET/SDH con la familia de protocoloS IPv4 habilitada. Los cambios se agregan como cambios transitorios.
- Requisitos
- Descripción general y script de confirmación
- Configuración
- Verificación
- Solución de problemas
Requisitos
En este ejemplo, se utilizan los siguientes componentes de hardware y software:
Dispositivo que ejecuta Junos OS con una o más interfaces SONET/SDH.
Junos OS versión 16.1R3 o posterior cuando se utiliza una secuencia de comandos de Python.
Descripción general y script de confirmación
El script de confirmación de este ejemplo encuentra todas las interfaces SONET/SDH con la familia de protocolo IPv4 habilitada en la configuración y agrega la encapsulation ppp
instrucción a la configuración de interfaz. La secuencia de comandos de confirmación genera un cambio transitorio, que agrega el cambio a la configuración de pago, pero no a la configuración candidata. El script se muestra en SLAX, XSLT y Python.
Las versiones SLAX y XSLT de la secuencia de comandos de confirmación generan el cambio transitorio mediante el uso de la jcs:emit-change
plantilla, que es una plantilla auxiliar contenida en el archivo de importación junos.xsl . El tag
parámetro de la jcs:emit-change
plantilla tiene el valor transient-change
, que dirige la secuencia de comandos a emitir el cambio como un cambio transitorio en lugar de como un cambio persistente. El content
parámetro de la jcs:emit-change
plantilla incluye las instrucciones de configuración que se agregarán como cambio transitorio.
La versión Python del script de confirmación genera el cambio transitorio mediante el uso de la jcs.emit_change()
función, que se importa desde el jcs
módulo. La secuencia de comandos de Python indica que se trata de un cambio transitorio al pasar en el argumento posicionaal 'transitorio-change'.
Sintaxis XSLT
<?xml version="1.0" standalone="yes"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:junos="http://xml.juniper.net/junos/*/junos" xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm" xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0"> <xsl:import href="../import/junos.xsl"/> <xsl:template match="configuration"> <xsl:for-each select="interfaces/interface[starts-with(name, 'so-') and unit/family/inet]"> <xsl:call-template name="jcs:emit-change"> <xsl:with-param name="tag" select="'transient-change'"/> <xsl:with-param name="content"> <encapsulation>ppp</encapsulation> </xsl:with-param> </xsl:call-template> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Sintaxis SLAX
version 1.0; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; import "../import/junos.xsl"; match configuration { for-each (interfaces/interface[starts-with(name, 'so-') and unit/family/inet]) { call jcs:emit-change($tag = 'transient-change') { with $content = { <encapsulation> "ppp"; } } } }
Sintaxis de Python
from junos import Junos_Configuration import jcs def main(): # Get configuration root object root = Junos_Configuration for element in root.xpath("./interfaces/ \ interface[starts-with(name,'so-') and unit/family/inet]"): if_name = element.find('name').text change_xml = """ <interfaces> <interface> <name>{0}</name> <encapsulation>ppp</encapsulation> </interface> </interfaces> """.format(if_name).strip() jcs.emit_change(change_xml, "transient-change", "xml") jcs.emit_warning("Adding 'ppp' encapsulation to SONET interface: " + if_name) jcs.emit_warning(change_xml) if __name__ == '__main__': main()
Configuración
Procedimiento
Procedimiento paso a paso
Para descargar, habilitar y probar la secuencia de comandos.
Copie el script en un archivo de texto, asigne un nombre al archivo encap-ppp.xsl, encap-ppp.slax o encap-ppp.py según corresponda, y cópielo en el directorio /var/db/scripts/commit/ del dispositivo.
Nota:Los scripts de Python sin firma deben ser propiedad de la raíz o de un usuario de la clase de inicio de sesión de Junos OS
super-user
, y solo el propietario del archivo puede tener permiso de escritura para el archivo.En el modo de configuración, configure la
file
instrucción y el nombre de archivo de secuencia de comandos en el[edit system scripts commit]
nivel de jerarquía.[edit] user@host# set system scripts commit file encap-ppp.xsl
Configure la
allow-transients
instrucción para habilitar scripts de confirmación para cargar cambios transitorios en la configuración de pago.[edit] user@host# set system scripts commit allow-transients
Si el script está escrito en Python, habilite la ejecución de scripts de Python sin firmar.
[edit] user@host# set system scripts language python
Nota:Configure la
language python3
instrucción para usar Python 3 para ejecutar scripts de Python, o configure lalanguage python
instrucción para usar Python 2.7 para ejecutar scripts de Python. Para obtener más información, consulte idioma.Para probar que la secuencia de comandos de confirmación genera el cambio transitorio correctamente, asegúrese de que la configuración contiene la condición que provoca el cambio. Asegúrese de que la
encapsulation ppp
instrucción no se incluye en el[edit interfaces so-fpc/pic/port]
nivel de jerarquía para al menos una interfaz SONET/SDH.Emita el
commit check
comando para previsualizar un seguimiento del procesamiento de script de confirmación para comprobar que la secuencia de comandos agregará el cambio transitorio a la configuración de pago. Elcommit check
comando verifica la sintaxis de la configuración antes de una confirmación, pero no confirma los cambios.Emita el
commit check | display detail
comando para mostrar un seguimiento detallado del procesamiento de scripts de confirmación. En el resultado de muestra, hay dos cambios transitorios que se cargan en la configuración de pago.[edit] user@host# commit check | display detail 2011-06-15 12:07:30 PDT: reading commit script configuration 2011-06-15 12:07:30 PDT: testing commit script configuration 2011-06-15 12:07:30 PDT: opening commit script '/var/db/scripts/commit/encap-ppp.xsl' 2011-06-15 12:07:30 PDT: reading commit script 'encap-ppp.xsl' 2011-06-15 12:07:30 PDT: running commit script 'encap-ppp.xsl' 2011-06-15 12:07:30 PDT: processing commit script 'encap-ppp.xsl' 2011-06-15 12:07:30 PDT: no errors from encap-ppp.xsl 2011-06-15 12:07:30 PDT: saving commit script changes for script encap-ppp.xsl 2011-06-15 12:07:30 PDT: summary of script encap-ppp.xsl: changes 0, transients 2 (allowed), syslog 0 2011-06-15 12:07:30 PDT: start loading commit script changes 2011-06-15 12:07:30 PDT: no commit script changes 2011-06-15 12:07:30 PDT: updating transient changes into transient tree 2011-06-15 12:07:30 PDT: finished loading commit script changes 2011-06-15 12:07:30 PDT: copying juniper.db to juniper.data+ 2011-06-15 12:07:30 PDT: finished copying juniper.db to juniper.data+ 2011-06-15 12:07:30 PDT: exporting juniper.conf 2011-06-15 12:07:30 PDT: merging transient changes ... configuration check succeeds
Después de comprobar que la secuencia de comandos produce los cambios correctos, emita el
commit
comando para iniciar la operación de confirmación y ejecutar el script.user@host# commit
Verificación
Verificar la configuración
Propósito
Compruebe que los cambios correctos están integrados en la configuración de pago. Si hay una o más interfaces SONET/SDH con la familia de protocoloS IPv4 habilitada, debería ver la encapsulation ppp
instrucción agregada como un cambio transitorio en la jerarquía de interfaz.
Acción
Para ver la configuración con cambios transitorios, emita el comando del modo de show interfaces | display commit-scripts
configuración. El show interfaces | display commit-scripts
comando muestra todas las instrucciones que se encuentran en la configuración, incluidas las instrucciones que se generan mediante cambios transitorios. Si hay una o más interfaces SONET/SDH con la familia de protocoloS IPv4 habilitada, el resultado es similar al siguiente:
[edit] user@host# show interfaces | display commit-scripts ... so-1/2/3 { mtu 576; encapsulation ppp; /* Added by transient change. */ unit 0 { family inet { address 10.0.0.3/32; } } } so-1/2/4 { encapsulation ppp; /* Added by transient change. */ unit 0 { family inet { address 10.0.0.4/32; } } } so-2/3/4 { encapsulation cisco-hdlc; # Not affected by the script, because IPv4 protocol # family is not configured on this interface. unit 0 { family mpls; } }
Solución de problemas
Solución de problemas de errores de confirmación
Problema
La CLI genera un error de cambio transitorio no válido y la confirmación falla.
user@host# commit check error: invalid transient change generated by commit script: encap-ppp.xsl warning: 1 transient change was generated without [system scripts commit allow-transients] error: 1 error reported by commit scripts error: commit script failure
Solución
Debe configurar la instrucción en el allow-transients
[edit system scripts commit]
nivel de jerarquía para habilitar scripts de confirmación para cargar cambios transitorios en la configuración de pago.
Configure la siguiente instrucción para permitir cambios transitorios:
[edit] user@host# set system scripts commit allow-transients