Exemple : générer des modifications de configuration persistantes et transitoires à l’aide de scripts de validation
Exemple : générer un changement persistant
Les scripts de validation Junos OS permettent aux utilisateurs de personnaliser le processus de validation de leurs configurations en fonction de leurs propres pratiques et stratégies et d’appliquer des règles de configuration personnalisées pendant le processus de validation. Cet exemple illustre un script de validation qui génère une modification persistante qui ajoute l’instruction family mpls
dans la configuration des interfaces SONET/SDH lorsque l’instruction n’est pas déjà incluse dans la configuration. Si vous ne configurez pas explicitement la famille de protocoles MPLS sur une interface, l’interface n’est pas activée pour les applications MPLS.
Exigences
Cet exemple utilise les composants matériels et logiciels suivants :
Équipement exécutant Junos OS avec une ou plusieurs interfaces SONET/SDH.
Junos OS Version 16.1R3 ou version ultérieure en cas d’utilisation d’un script Python.
Script de présentation et de validation
Le script de validation de cet exemple détecte toutes les interfaces SONET/SDH dont l’interface logique est configurée, mais dont l’instruction family mpls
n’est pas configurée. Pour ces interfaces, le script ajoute l’instruction family mpls
à la configuration de l’interface en tant que changement persistant au niveau de la [edit interfaces interface-name unit logical-unit-number]
hiérarchie. Le script est affiché dans SLAX, XSLT et Python.
Les versions SLAX et XSLT du script de validation génèrent la modification persistante à l’aide du jcs:emit-change
modèle, qui est un modèle d’assistance contenu dans le fichier d’importation junos.xsl . Le tag
paramètre du jcs:emit-change
modèle est omis, ce qui oblige le script à émettre la modification en tant que modification persistante. Le content
paramètre du jcs:emit-change
modèle inclut les instructions de configuration à ajouter en tant que modification persistante. Le message
paramètre du jcs:emit-change
modèle inclut le message d’avertissement à afficher dans la CLI, vous informant que la configuration a été modifiée.
La version Python du script de validation génère la modification persistante à l’aide de la jcs.emit_change()
fonction, qui est importée à partir du jcs
module. Le script Python indique qu’il s’agit d’une modification persistante en passant l’argument positionnel « change ».
Syntaxe 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>
Syntaxe 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>; } } } } } }
Syntaxe 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()
Configuration
Procédure
Procédure étape par étape
Pour télécharger, activer et tester le script.
Copiez le script dans un fichier texte, nommez le fichier mpls.xsl, mpls.slax ou mpls.py le cas échéant, et copiez-le dans le répertoire /var/db/scripts/commit/ sur l’équipement.
Note:Les scripts Python non signés doivent appartenir à la classe de connexion Junos OS
super-user
ou à un utilisateur racine, et seul le propriétaire du fichier peut avoir l’autorisation d’écrire le fichier.En mode configuration, configurez l’instruction
file
et le nom du script au niveau de la[edit system scripts commit]
hiérarchie.[edit] user@host# set system scripts commit file mpls.xsl
Si le script est écrit en Python, activez l’exécution de scripts Python non signés.
[edit] user@host# set system scripts language python
Note:Configurez l’instruction
language python3
pour utiliser Python 3 pour exécuter des scripts Python, ou configurez l’instructionlanguage python
pour utiliser Python 2.7 pour exécuter des scripts Python. Pour plus d’informations, consultez la langue.Pour tester que le script de validation génère correctement la modification persistante, assurez-vous que la configuration contient la condition qui a provoqué la modification. Pour tester ce script, assurez-vous que l’instruction
family mpls
n’est pas incluse au niveau de la[edit interfaces so-fpc/pic/port unit logical-unit-number]
hiérarchie pour au moins une interface SONET/SDH.Émettez la
commit check
commande pour visualiser une trace du traitement de script de validation pour vérifier que le script ajoutera la modification persistante à la configuration du candidat. Lacommit check
commande vérifie la syntaxe de la configuration avant une validation, mais elle ne valide pas les modifications.Le script de validation de cet exemple produit un message pour chaque modification qu’il apporte. Utilisez la
commit check
commande pour afficher un aperçu de ces messages pour déterminer si le script va mettre à jour la configuration avec l’instructionfamily mpls
pour les interfaces appropriées.Envoyez la
commit check | display xml
commande pour afficher la version au format XML du message. L’exemple de sortie indique que le script ajoutera l’instructionfamily mpls
à la configuration de l’interface so-2/3/4.0 pendant l’opération de validation.[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>
Pour afficher une trace détaillée du traitement des scripts de validation, émettez la
commit check | display detail
commande. Dans l’exemple de sortie, une modification persistante sera chargée dans la configuration pendant l’opération de validation.[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
Après avoir vérifié que le script produit les modifications correctes, exécutez la
commit
commande pour lancer l’opération de validation et exécuter le script.user@host# commit
Vérification
Vérification de la configuration
But
Vérifiez que les modifications correctes sont intégrées à la configuration.
Action
Après avoir exécuté l’opération de validation, consultez la configuration en publiant la commande du show interfaces
mode de configuration. Si la famille de protocoles MPLS n’est pas activée sur une ou plusieurs interfaces SONET/SDH avant l’exécution du script, le résultat est similaire au suivant :
[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 ...
Exemple : générer un changement transitoire
Cet exemple utilise un script de validation pour définir l’encapsulation PPP sur toutes les interfaces SONET/SDH avec la famille de protocoles IPv4 activée. Les modifications sont ajoutées en tant que modifications transitoires.
Exigences
Cet exemple utilise les composants matériels et logiciels suivants :
Équipement exécutant Junos OS avec une ou plusieurs interfaces SONET/SDH.
Junos OS Version 16.1R3 ou version ultérieure en cas d’utilisation d’un script Python.
Script de présentation et de validation
Le script de validation de cet exemple trouve toutes les interfaces SONET/SDH avec la famille de protocoles IPv4 activée dans la configuration et ajoute l’instruction encapsulation ppp
à la configuration de l’interface. Le script de validation génère une modification transitoire, qui ajoute la modification à la configuration de paiement, mais pas à la configuration du candidat. Le script est affiché dans SLAX, XSLT et Python.
Les versions SLAX et XSLT du script de validation génèrent la modification transitoire à l’aide du jcs:emit-change
modèle, qui est un modèle d’aide contenu dans le fichier d’importation junos.xsl . Le tag
paramètre du modèle a la jcs:emit-change
valeur transient-change
, qui ordonne au script d’émettre la modification sous la forme d’une modification transitoire plutôt que persistante. Le content
paramètre du jcs:emit-change
modèle inclut les instructions de configuration à ajouter en tant que modification transitoire.
La version Python du script de validation génère le changement transitoire à l’aide de la jcs.emit_change()
fonction, qui est importée à partir du jcs
module. Le script Python indique qu’il s’agit d’une modification transitoire en passant l’argument positionnel « transitoire-changement ».
Syntaxe 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>
Syntaxe 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"; } } } }
Syntaxe 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()
Configuration
Procédure
Procédure étape par étape
Pour télécharger, activer et tester le script.
Copiez le script dans un fichier texte, nommez le fichier encap-ppp.xsl, encap-ppp.slax ou encap-ppp.py le cas échéant, puis copiez-le dans le répertoire /var/db/scripts/commit/ sur l’équipement.
Note:Les scripts Python non signés doivent appartenir à la classe de connexion Junos OS
super-user
ou à un utilisateur racine, et seul le propriétaire du fichier peut avoir l’autorisation d’écrire le fichier.En mode configuration, configurez l’instruction
file
et le nom du script au niveau de la[edit system scripts commit]
hiérarchie.[edit] user@host# set system scripts commit file encap-ppp.xsl
Configurez l’instruction
allow-transients
pour permettre aux scripts de validation de charger les modifications transitoires dans la configuration de caisse.[edit] user@host# set system scripts commit allow-transients
Si le script est écrit en Python, activez l’exécution de scripts Python non signés.
[edit] user@host# set system scripts language python
Note:Configurez l’instruction
language python3
pour utiliser Python 3 pour exécuter des scripts Python, ou configurez l’instructionlanguage python
pour utiliser Python 2.7 pour exécuter des scripts Python. Pour plus d’informations, consultez la langue.Pour tester que le script de validation génère correctement la modification transitoire, assurez-vous que la configuration contient la condition qui déclenche la modification. Assurez-vous que l’instruction
encapsulation ppp
n’est pas incluse au niveau de la[edit interfaces so-fpc/pic/port]
hiérarchie pour au moins une interface SONET/SDH.Émettez la
commit check
commande pour visualiser une trace du traitement de script de validation pour vérifier que le script ajoutera la modification transitoire à la configuration de paiement. Lacommit check
commande vérifie la syntaxe de la configuration avant une validation, mais elle ne valide pas les modifications.Émettez la
commit check | display detail
commande pour afficher une trace détaillée du traitement des scripts de validation. Dans l’exemple de sortie, deux modifications transitoires sont chargées dans la configuration de paiement.[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
Après avoir vérifié que le script produit les modifications correctes, exécutez la
commit
commande pour lancer l’opération de validation et exécuter le script.user@host# commit
Vérification
Vérification de la configuration
But
Vérifiez que les modifications correctes sont intégrées à la configuration de paiement. S’il existe une ou plusieurs interfaces SONET/SDH avec la famille de protocoles IPv4 activée, vous devriez voir l’instruction encapsulation ppp
ajoutée comme une modification transitoire à la hiérarchie d’interfaces.
Action
Pour afficher la configuration en cas de modifications transitoires, passez la commande du mode de show interfaces | display commit-scripts
configuration. La show interfaces | display commit-scripts
commande affiche toutes les instructions de la configuration, y compris celles générées par des modifications transitoires. S’il existe une ou plusieurs interfaces SONET/SDH avec la famille de protocoles IPv4 activée, le résultat est similaire à ce qui suit :
[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; } }
Dépannage
Dépannage des erreurs de validation
Problème
L’interface cli génère une erreur de modification transitoire non valide et la validation échoue.
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
Solution
Vous devez configurer l’instruction allow-transients
au niveau de la [edit system scripts commit]
hiérarchie pour permettre aux scripts de validation de charger les modifications transitoires dans la configuration de paiement.
Configurez l’instruction suivante pour autoriser les modifications transitoires :
[edit] user@host# set system scripts commit allow-transients