AUF DIESER SEITE
Beispiel: Automatisches Konfigurieren logischer Schnittstellen und IP-Adressen
Für jede Schnittstelle, die Sie konfigurieren, sind mindestens eine logische Einheit und eine IP-Adresse erforderlich. ATM-Schnittstellen ( Asynchronous Transfer Mode ) erfordern außerdem einen Virtual Circuit Identifier (VCI) für jede logische Schnittstelle. Wenn Sie mehrere logische Einheiten auf einer Schnittstelle konfigurieren müssen, können Sie ein Commit-Skript und ein Makro verwenden, um die Aufgabe schnell und fehlerfrei abzuschließen.
Anforderungen
In diesem Beispiel wird ein Gerät mit Junos OS und physischen ATM-Schnittstellen verwendet.
Übersicht und Commit-Skript
Das folgende Commitskript erweitert eine apply-macro
Anweisung, die den Namen einer physischen ATM-Schnittstelle und eine Reihe von Parametern bereitstellt, die angeben, wie eine Reihe logischer Einheiten auf der Schnittstelle konfiguriert werden soll. Die Einheiten und VCI-Nummern werden fortlaufend von der unit
Variablen zur max
Variablen nummeriert und erhalten ab der address
Variablen IP-Adressen. Um die logischen Einheiten zu durchlaufen, verwendet XSLT (Extensible Stylesheet Language Transformations) die Rekursion, die in der <emit-interface>
Vorlage implementiert ist. Die Berechnung der nächsten Adresse erfolgt in der <next-address>
Vorlage.
Das Beispielskript wird sowohl in XSLT- als auch in SLAX-Syntax angezeigt:
XSLT-Syntax
<?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/apply-macro"> <xsl:variable name="device" select="name"/> <xsl:variable name="address" select="data[name='address']/value"/> <xsl:variable name="max" select="data[name='max']/value"/> <xsl:variable name="unit" select="data[name='unit']/value"/> <xsl:variable name="real-max"> <xsl:choose> <xsl:when test="string-length($max) > 0"> <xsl:value-of select="$max"/> </xsl:when> <xsl:otherwise>0</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="real-unit"> <xsl:choose> <xsl:when test="string-length($unit) > 0"> <xsl:value-of select="$unit"/> </xsl:when> <xsl:when test="contains($device, '.')"> <xsl:value-of select="substring-after($device, '.')"/> </xsl:when> <xsl:otherwise>0</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="real-device"> <xsl:choose> <xsl:when test="contains($device, '.')"> <xsl:value-of select="substring-before($device, '.')"/> </xsl:when> <xsl:otherwise><xsl:value-of select="$device"/></xsl:otherwise> </xsl:choose> </xsl:variable> <transient-change> <interfaces> <interface> <name><xsl:value-of select="$real-device"/></name> <xsl:call-template name="emit-interface"> <xsl:with-param name="address" select="$address"/> <xsl:with-param name="unit" select="$real-unit"/> <xsl:with-param name="max" select="$real-max"/> </xsl:call-template> </interface> </interfaces> </transient-change> </xsl:for-each> </xsl:template> <xsl:template name="emit-interface"> <xsl:param name="$max"/> <xsl:param name="$unit"/> <xsl:param name="$address"/> <unit> <name><xsl:value-of select="$unit"/></name> <vci><xsl:value-of select="$unit"/></vci> <family> <inet> <address><xsl:value-of select="$address"/></address> </inet> </family> </unit> <xsl:if test="$max > $unit"> <xsl:call-template name="emit-interface"> <xsl:with-param name="address"> <xsl:call-template name="next-address"> <xsl:with-param name="address" select="$address"/> </xsl:call-template> </xsl:with-param> <xsl:with-param name="unit" select="$unit + 1"/> <xsl:with-param name="max" select="$max"/> </xsl:call-template> </xsl:if> </xsl:template> <xsl:template name="next-address"> <xsl:param name="address"/> <xsl:variable name="arg-prefix" select="substring-after($address, '/')"/> <xsl:variable name="arg-addr" select="substring-before($address, '/')"/> <xsl:variable name="addr"> <xsl:choose> <xsl:when test="string-length($arg-addr) > 0"> <xsl:value-of select="$arg-addr"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$address"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="prefix"> <xsl:choose> <xsl:when test="string-length($arg-prefix) > 0"> <xsl:value-of select="$arg-prefix"/> </xsl:when> <xsl:otherwise>32</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="a1" select="substring-before($addr, '.')"/> <xsl:variable name="a234" select="substring-after($addr, '.')"/> <xsl:variable name="a2" select="substring-before($a234, '.')"/> <xsl:variable name="a34" select="substring-after($a234, '.')"/> <xsl:variable name="a3" select="substring-before($a34, '.')"/> <xsl:variable name="a4" select="substring-after($a34, '.')"/> <xsl:variable name="r3"> <xsl:choose> <xsl:when test="$a4 < 255"> <xsl:value-of select="$a3"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$a3 + 1"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="r4"> <xsl:choose> <xsl:when test="$a4 < 255"> <xsl:value-of select="$a4 + 1"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="0"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:value-of select="$a1"/> <xsl:text>.</xsl:text> <xsl:value-of select="$a2"/> <xsl:text>.</xsl:text> <xsl:value-of select="$r3"/> <xsl:text>.</xsl:text> <xsl:value-of select="$r4"/> <xsl:text>/</xsl:text> <xsl:value-of select="$prefix"/> </xsl:template> </xsl:stylesheet>
SLAX-Syntax
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/apply-macro) { var $device = name; var $address = data[name='address']/value; var $max = data[name='max']/value; var $unit = data[name='unit']/value; var $real-max = { if (string-length($max) > 0) { expr $max; } else { expr "0"; } } var $real-unit = { if (string-length($unit) > 0) { expr $unit; } else if (contains($device, '.')) { expr substring-after($device, '.'); } else { expr "0"; } } var $real-device = { if (contains($device, '.')) { expr substring-before($device, '.'); } else { expr $device; } } <transient-change> { <interfaces> { <interface> { <name> $real-device; call emit-interface($address, $unit = $real-unit, $max = $real-max); } } } } } emit-interface ($max, $unit, $address) { <unit> { <name> $unit; <vci> $unit; <family> { <inet> { <address> $address; } } } if ($max > $unit) { call emit-interface($unit = $unit + 1, $max) { with $address = { call next-address($address); } } } } next-address ($address) { var $arg-prefix = substring-after($address, '/'); var $arg-addr = substring-before($address, '/'); var $addr = { if (string-length($arg-addr) > 0) { expr $arg-addr; } else { expr $address; } } var $prefix = { if (string-length($arg-prefix) > 0) { expr $arg-prefix; } else { expr "32"; } } var $a1 = substring-before($addr, '.'); var $a234 = substring-after($addr, '.'); var $a2 = substring-before($a234, '.'); var $a34 = substring-after($a234, '.'); var $a3 = substring-before($a34, '.'); var $a4 = substring-after($a34, '.'); var $r3 = { if ($a4 < 255) { expr $a3; } else { expr $a3 + 1; } } var $r4 = { if ($a4 < 255) { expr $a4 + 1; } else { expr 0; } } expr $a1; expr "."; expr $a2; expr "."; expr $r3; expr "."; expr $r4; expr "/"; expr $prefix; }
Konfiguration
Verfahren
Schritt-für-Schritt-Anleitung
So laden Sie das Skript herunter, aktivieren es und führen es aus:
Kopieren Sie das Skript in eine Textdatei, nennen Sie die Datei atm-logical.xsl oder atm-logical.slax und laden Sie sie in das Verzeichnis /var/db/scripts/commit/ auf dem Gerät herunter.
Wählen Sie die folgenden Testkonfigurationszeilen aus, und drücken Sie STRG+C, um sie in die Zwischenablage zu kopieren.
Wenn Sie die SLAX-Version des Skripts verwenden, ändern Sie den Dateinamen auf der Hierarchieebene
[edit system scripts commit file]
in atm-logical.slax.system { scripts { commit { allow-transients; file atm-logical.xsl; } } } interfaces { apply-macro at-1/2/3 { address 10.12.13.14/20; max 200; unit 32; } at-1/2/3 { atm-options { pic-type atm2; vpi 0; } } }
Geben Sie im Konfigurationsmodus den
load merge terminal
Befehl zum Zusammenführen der Zeilengruppen in Ihre Gerätekonfiguration ein.[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 Zwischenablage mit der Maus und dem Einfügesymbol ein.
Drücken Sie die Eingabetaste.
Drücken Sie Strg+d.
Geben Sie den
commit
Befehl ein, um die Konfiguration zu bestätigen.user@host# commit
Überprüfung
Überprüfen der Konfiguration
Zweck
Stellen Sie sicher, dass die richtigen Änderungen in die Konfiguration integriert sind.
Aktion
Bevor Sie die Konfiguration bestätigen, können Sie überprüfen, ob das Commit-Skript die richtigen Ergebnisse liefert, indem Sie den show interfaces at-1/2/3 | display commit-scripts
Befehl configuration mode eingeben. Nachdem Sie die Konfiguration festgeschrieben haben, können Sie die aktive Konfiguration überprüfen, indem Sie den show configuration interfaces at-1/2/3
Befehl operational mode eingeben. Die folgende Ausgabe wird angezeigt:
atm-options { pic-type atm2; vpi 0; } unit 32 { vci 32; family inet { address 10.12.13.14/20; } } unit 33 { vci 33; family inet { address 10.12.13.15/20; } } unit 34 { vci 34; family inet { address 10.12.13.16/20; } } unit 35 { vci 35; family inet { address 10.12.13.17/20; } } ... Logical units 36 through 199 are omitted for brevity ... unit 200 { vci 200 ; family inet { address 10.12.13.182/20; } }
Bedeutung
Die | display commit-scripts
Option zeigt die Konfigurationsdaten an, nachdem alle Commit-Skripte angewendet wurden. Die Ausgabe enthält sowohl persistente als auch vorübergehende Änderungen. Wenn die entsprechenden unit
und vci
auf jeder ATM-Schnittstelle konfiguriert sind, wird das Commit-Skript während eines Commit-Vorgangs erfolgreich ausgeführt. Nachdem Sie die Konfiguration festgeschrieben haben, können Sie die aktive Konfiguration überprüfen, indem Sie den show configuration interfaces at-1/2/3
Befehl operational mode eingeben.