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 colorgroup-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 blueeiner 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 0einer 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-usersein, 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 python3Anweisung, um Python 3 zur Ausführung von Python-Skripten zu verwenden, oder konfigurieren Sie dielanguage pythonAnweisung, 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 terminalBefehl 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;
}