AUF DIESER SEITE
Beispiel: Erstellen einer benutzerdefinierten Konfigurationssyntax mit Commit-Skript-Makros
Eine Junos OS-Konfiguration kann Anweisungen mit benutzerdefinierter Konfigurationssyntax enthalten apply-macro
. Für sich genommen hat die apply-macro
Aussage keine betrieblichen Auswirkungen auf das Gerät. Commit-Skript-Makros verarbeiten die benutzerdefinierte Konfigurationssyntax und erweitern sie in Standardkonfigurationsanweisungen von Junos OS, die dann als persistente oder vorübergehende Änderung hinzugefügt werden. In diesem Beispiel wird veranschaulicht, wie Sie Commit-Skript-Makros verwenden, um Anweisungen zu untersuchen apply-macro
und Konfigurationsanweisungen für Junos OS zu generieren.
Anforderungen
In diesem Beispiel werden die folgenden Hardware- und Softwarekomponenten verwendet:
Gerät mit Junos OS.
Junos OS Version 16.1R3 oder höher bei Verwendung eines Python-Skripts.
Überblick und Commit-Skript
Tabelle 1 zeigt ein Makro mit benutzerdefinierter Syntax und der entsprechenden Erweiterung der standardmäßigen Befehlszeilenschnittstelle (CLI) von Junos OS.
Benutzerdefinierte Makrosyntax |
Erweiterte Junos OS CLI-Syntax |
---|---|
protocols { mpls { apply-macro blue-type-lsp { 10.1.1.1; 10.2.2.2; 10.3.3.3; 10.4.4.4; color blue; group-value 0; } } } |
protocols { mpls { admin-groups { blue 0; } label-switched-path blue-lsp-10.1.1.1 { to 10.1.1.1; admin-group include-any blue; } label-switched-path blue-lsp-10.2.2.2 { to 10.2.2.2; admin-group include-any blue; } label-switched-path blue-lsp-10.3.3.3 { to 10.3.3.3; admin-group include-any blue; } label-switched-path blue-lsp-10.4.4.4 { to 10.4.4.4; admin-group include-any blue; } } } |
In diesem Beispiel prüft der Junos OS Management(mgd)-Prozess die Konfiguration und sucht apply-macro
nach Anweisungen. Für jede apply-macro
Anweisung mit dem color
auf der [edit protocols mpls]
Hierarchieebene enthaltenen Parameter generiert das Skript eine vorübergehende Änderung unter Verwendung der innerhalb der apply-macro
Anweisung bereitgestellten Daten, um das Makro in eine standardmäßige administrative Junos OS-Gruppe für LSPs zu erweitern.
Damit dieses Beispiel funktioniert, muss eine apply-macro
Anweisung auf Hierarchieebene [edit protocols mpls]
mit einer Gruppe von Adressen, einem und einem color
group-value
Parameter enthalten sein. Das Commit-Skript konvertiert jede Adresse in eine LSP-Konfiguration, und das Skript konvertiert den color
Parameter in eine administrative Gruppe.
Nachfolgend finden Sie die Anweisungen zum Commit-Skript, die das Makro in Tabelle 1 erweitern, und eine Zeilen-für-Zeile-Erläuterung des Skripts:
XSLT-Syntax
1 <?xml version="1.0" standalone="yes"?> 2 <xsl:stylesheet version="1.0" 3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 4 xmlns:junos="http://xml.juniper.net/junos/*/junos" 5 xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm" 6 xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0"> 7 <xsl:import href="../import/junos.xsl"/> 8 <xsl:template match="configuration"> 9 <xsl:variable name="mpls" select="protocols/mpls"/> 10 <xsl:for-each select="$mpls/apply-macro[data/name = 'color']"> 11 <xsl:variable name="color" select="data[name = 'color']/value"/> 12 <xsl:variable name="group-value" select="data[name = \ 'group-value']/value"/> 13 <transient-change> 14 <protocols> 15 <mpls> 16 <admin-groups> 17 <name> 18 <xsl:value-of select="$color"/> 19 </name> 20 <group-value> 21 <xsl:value-of select="$group-value"/> 22 </group-value> 23 </admin-groups> 24 <xsl:for-each select="data[not(value)]/name"> 25 <label-switched-path> 26 <name> 27 <xsl:value-of select="concat($color, '-lsp-', .)"/> 28 </name> 29 <to><xsl:value-of select="."/></to> 30 <admin-group> 31 <include-any> 32 <xsl:value-of select="$color"/> 33 </include-any> 34 </admin-group> 35 </label-switched-path> 36 </xsl:for-each> 37 </mpls> 38 </protocols> 39 </transient-change> 40 </xsl:for-each> 41 </xsl:template> 42 </xsl:stylesheet>
Die Zeilen 1 bis 8 (und die Zeilen 43 und 44) sind das Kesselplate, das Sie in jedem XSLT-Commit-Skript enthalten. Zur Kürze entfallen hier die Linien 1 bis 8.
Zeile 9 weist der [edit protocols mpls]
Variablen namens mpls
.
9 <xsl:variable name="mpls" select="protocols/mpls"/>
Zeile 10 wählt jede apply-macro
Anweisung auf der [edit protocols mpls]
Hierarchieebene aus, die den color
Parameter enthält. Die Beispielkonfiguration in Tabelle 1 enthält nur eine apply-macro
Anweisung. Daher wird diese <xsl:for-each>
Programmieranweisung nur ein einziges Mal wirksam.
10 <xsl:for-each select="$mpls/apply-macro[data/name = 'color']">
Zeile 11 weist den Wert des Parameters in diesem color
Fall blue
einer Variablen namens color
.
11 <xsl:variable name="color" select="data[name = 'color']/value"/>
Zeile 12 weist den Wert des Parameters in diesem group-value
Fall 0
einer Variablen namens group-value
.
12 <xsl:variable name="group-value" select="data[name = \ 'group-value']/value"/>
Zeilen 13 bis 15 erzeugen eine transiente Änderung auf Hierarchieebene [edit protocols mpls]
.
13 <transient-change> 14 <protocols> 15 <mpls>
Die Zeilen 16 bis 23 fügen die admin-groups
Anweisung der Konfiguration hinzu und weisen dem Gruppennamen den Wert der color
Variablen und den Wert der group-value
Variable dem Gruppenwert zu.
16 <admin-groups> 17 <name> 18 <xsl:value-of select="$color"/> 19 </name> 20 <group-value> 21 <xsl:value-of select="$group-value"/> 22 </group-value> 23 </admin-groups>
Die resultierenden Konfigurationsanweisungen lauten wie folgt:
admin-groups { blue 0; }
Zeile 24 wählt den Namen aller Parameter aus, denen kein Wert zugewiesen wurde, bei dem es sich in diesem Fall um die vier IP-Adressen handelt. Diese <xsl:for-each>
Programmieranweisung verwendet Rekursion durch das Makro und wählt jede IP-Adresse wiederum aus. Die color
und group-value
die Parameter haben jeweils einen Wert zugewiesen (blue
bzw 0
.), so dass diese Zeile nicht für sie gilt.
24 <xsl:for-each select="data[not(value)]/name">
Zeile 25 fügt die label-switched-path
Anweisung in der Konfiguration hinzu.
25 <label-switched-path>
Die Zeilen 26 bis 28 weisen einen label-switched-path
Namen zu, der den Wert der color
Variablen, des Textes -lsp
und der aktuellen IP-Adresse, die derzeit von Zeile 24 ausgewählt wird (dargestellt durch die " ). .
26 <name> 27 <xsl:value-of select="concat($color, '-lsp-', .)"/> 28 </name>
Zeile 29 fügt die to
Anweisung zur Konfiguration hinzu und legt ihren Wert für die IP-Adresse fest, die derzeit von Zeile 24 ausgewählt wird.
29 <to><xsl:value-of select="."/></to>
Die Zeilen 30 bis 34 fügen die admin-group include-any
Anweisung der Konfiguration hinzu und legen ihren Wert auf den Wert der color
Variablen fest.
30 <admin-group> 31 <include-any> 32 <xsl:value-of select="$color"/> 33 </include-any> 34 </admin-group>
Die resultierenden Konfigurationsanweisungen (für einen Durchlauf) lauten wie folgt:
label-switched-path blue-lsp-10.1.1.1 { to 10.1.1.1; admin-group include-any blue; }
Die Zeilen 35 bis 42 schließen Tags.
35 </label-switched-path> 36 </xsl:for-each> 37 </mpls> 38 </protocols> 39 </transient-change> 40 </xsl:for-each> 41 </xsl:template> 42 </xsl:stylesheet>
SLAX-Syntax
Das entsprechende SLAX-Skript lautet:
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 { var $mpls = protocols/mpls; for-each ($mpls/apply-macro[data/name = 'color']) { var $color = data[name = 'color']/value; var $group-value = data[name='group-value']/value; <transient-change> { <protocols> { <mpls> { <admin-groups> { <name> $color; <group-value> $group-value; } for-each (data[not(value)]/name) { <label-switched-path> { <name> $color _ '-lsp-' _ .; <to> .; <admin-group> { <include-any> $color; } } } } } } } }
Python-Syntax
Die folgende Python-Syntax erzeugt die identischen Konfigurationsänderungen:
from junos import Junos_Configuration import jcs def main(): # Get configuration root object root = Junos_Configuration for element in root.xpath("./protocols/mpls/ \ apply-macro[data/name='color']"): color = element.find("data[name='color']/value").text group_value = element.find("data[name='group-value']/value").text lsp_config ="" for element2 in element.xpath("data[not(value)]/name"): lsp_config = lsp_config + """ <label-switched-path> <name>{0}-lsp-{1}</name> <to>{1}</to> <admin-group> <include-any>{0}</include-any> </admin-group> </label-switched-path> """.format(color, element2.text) change_xml = """ <protocols> <mpls> <admin-groups> <name>{0}</name> <group-value>{1}</group-value> </admin-groups> {2} </mpls> </protocols> """.format(color, group_value, lsp_config).strip() jcs.emit_change(change_xml, "transient-change", "xml") if __name__ == '__main__': main()
Weitere Informationen zu diesem Beispiel finden Sie unter Beispiel: Konfigurieren von Administrativen Gruppen für LSPs.
Konfiguration
Verfahren
Schritt-für-Schritt-Verfahren
Zum Herunterladen, Aktivieren und Testen des Skripts:
Kopieren Sie das Skript in eine Textdatei, benennen Sie die Datei lsp-admin.xsl, lsp-admin.slax oder lsp-admin.py , und kopieren Sie sie in das /var/db/scripts/commit-Verzeichnis auf dem Gerät.
Hinweis:Nicht signierte Python-Skripte müssen entweder im Besitz eines Root-Benutzers oder eines Benutzers in der Anmeldungsklasse von Junos OS
super-user
sein, und nur der Dateibesitzer kann über Schreibberechtigungen für die Datei verfügen.Wenn das Skript in Python geschrieben ist, aktivieren Sie die Ausführung von nicht signierten Python-Skripten.
[edit] user@host# set system scripts language python
Hinweis:Konfigurieren Sie die
language python3
Anweisung, um Python 3 zur Ausführung von Python-Skripten zu verwenden, oder konfigurieren Sie dielanguage python
Anweisung, um Python 2.7 für die Ausführung von Python-Skripten zu verwenden. Weitere Informationen finden Sie unter Sprache.Wählen Sie die folgenden Testkonfigurationsstanzen aus, und drücken Sie Strg+c, um sie in die Zwischenspeicherung zu kopieren. Wenn Sie die SLAX- oder Python-Version des Skripts verwenden, aktualisieren Sie den Dateinamen auf Hierarchieebene
[edit system scripts commit file]
.system { scripts { commit { allow-transients; file lsp-admin.xsl; } } } protocols { mpls { apply-macro blue-type-lsp { 10.1.1.1; 10.2.2.2; 10.3.3.3; 10.4.4.4; color blue; group-value 0; } } }
Geben Sie im Konfigurationsmodus den
load merge terminal
Befehl aus, um die Stanzas in Ihre Gerätekonfiguration zu integrieren.[edit] user@host# load merge terminal [Type ^D at a new line to end input] ... Paste the contents of the clipboard here ...
Fügen Sie an der Eingabeaufforderung den Inhalt der Zwischenspeicherung mit der Maus und dem Symbol einfügen ein.
Drücken Sie die Enter-Taste.
Drücken Sie Strg+D.
Konfiguration bestätigen.
user@host# commit
Überprüfung
Überprüfung der Skriptausführung
Zweck
Vergewissern Sie sich, dass sich das Skript wie erwartet verhält.
Aktion
Um die vom Skript erstellten Konfigurationsanweisungen anzuzeigen, geben Sie den show protocols mpls | display commit-scripts
Befehl aus.
[edit] user@host# show protocols mpls | display commit-scripts apply-macro blue-type-lsp { 10.1.1.1; 10.2.2.2; 10.3.3.3; 10.4.4.4; color blue; group-value 0; } admin-groups { blue 0; } label-switched-path blue-lsp-10.1.1.1 { to 10.1.1.1; admin-group include-any blue; } label-switched-path blue-lsp-10.2.2.2 { to 10.2.2.2; admin-group include-any blue; } label-switched-path blue-lsp-10.3.3.3 { to 10.3.3.3; admin-group include-any blue; } label-switched-path blue-lsp-10.4.4.4 { to 10.4.4.4; admin-group include-any blue; }