Letztes Mal habe ich Op Script eingeführt, eine der einfachen Möglichkeiten, Junos 'On-Box-Python zu verwenden.
Als Fortsetzung vom letzten Mal möchte ich dieses Mal Commit Script vorstellen.
Ein Commit-Skript ist ein Skript des Junos-Skriptmechanismus Junoscript, das durch "Commit by User" ausgelöst wird.
Das Festschreibungsskript wird aufgerufen, wenn der Benutzer das Festschreiben ausführt, und steuert das Festschreiben oder ändert die festzuschreibende Konfiguration in Abhängigkeit von den Informationen wie dem Benutzer und dem Zeitpunkt des Festschreibens, der festzuschreibenden Konfiguration, dem aktuellen Gerätestatus usw. Sie können Dinge wie tun.
Beispielsweise sind die folgenden Anwendungsfälle möglich.
In Form von Worten können je nach Idee verschiedene Verwendungen in Betracht gezogen werden.
Dieses Mal werde ich Commit Script in On-Box Python mit einem einfachen Beispiel vorstellen.
Um Commit Script verwenden zu können, müssen Sie das gewünschte Skript in den Einstellungen wie folgt schreiben.
set system scripts language python
set system scripts commit file commit-script.py
Das hier beschriebene Skript sollte in "/ var / db / scripts / commit" erstellt werden.
Wenn Sie die Änderungsmethode * Transient Configuration * unter den Einstellungsänderungsmethoden zum Zeitpunkt des Festschreibens aktivieren möchten, nehmen Sie die folgenden zusätzlichen Einstellungen vor.
set system scripts commit allow-transients
Details werden später beschrieben, dies ist jedoch jedes Mal erforderlich, wenn eine Einstellung vorhanden ist, die Sie dynamisch aus dem Skript generieren möchten, z. B. das Erweitern der Einstellung durch ein Makro.
Versuchen wir nun Commit Script.
Ein Skript, das eine Konfiguration verweigert, für die kein Hostname festgelegt ist, lautet beispielsweise:
commit-script.py
from junos import Junos_Configuration
import jcs
def main():
root = Junos_Configuration
if root.find('./system/host-name') == None:
jcs.emit_error("Hostname is not defined!!!")
if __name__ == '__main__':
main()
Als eindeutige Begriffe werden "Junos_Configuration" und "jcs" erwähnt, aber "Junos-Configuration" ist das XML-Stammverzeichnis der Konfiguration, die festgeschrieben werden soll. Wenn Sie dies überprüfen, können Sie es festlegen. Sie können es überprüfen und ändern.
jcs
ist ein Namespace, der Methoden zum Generieren von Ereignissen, Abrufen des Status usw. in Commit Script definiert. Weitere Informationen finden Sie unter Offizielles Dokument. Bitte.
Der Inhalt des Skripts ist einfach. Extrahieren Sie das XML an der Position "/ system / host-name" aus der Konfiguration. Wenn das Ergebnis "None" lautet, rufen Sie "jcs.emit_error" auf und machen Sie einen Fehler. Wird ausgegeben.
Das Ausgabeergebnis ist wie folgt.
[edit]
root@vmx1# show system host-name
host-name vmx1;
[edit]
root@vmx1# delete system host-name
[edit]
root@vmx1# commit check
error: Hostname is not defined!!!
error: 1 error reported by commit scripts
error: commit script failure
[edit]
root@vmx1# rollback 0
load complete
[edit]
root@vmx1# commit check
configuration check succeeds
Auf diese Weise schlägt die Festschreibungsprüfung nur fehl, wenn der Hostname nicht enthalten ist. Übrigens, wenn Sie die Commit-Prüfung bestehen möchten, aber nur die Warnung anzeigen möchten, verwenden Sie "jcs.emit_warning" anstelle von "jcs.emit_error".
Als nächstes möchte ich ein Beispiel für das Ändern der Einstellungen vorstellen.
Es gibt zwei Möglichkeiten, die Einstellungen zu ändern: Eine besteht darin, dauerhafte Änderungen wie bei einem normalen Benutzer vorzunehmen, und die andere darin, nicht persistente (vorübergehende) Änderungen vorzunehmen.
Versuchen wir zunächst die permanente Bearbeitung. Hier ist beispielsweise ein Beispielskript, das die Systemzeitzone in "Asien / Tokio" ändert:
commit-script.py
import jcs
def main():
xml = '<system><time-zone>Asia/Tokyo</time-zone></system>'
jcs.emit_change(xml, "change", "xml")
if __name__ == '__main__':
main()
Sie können die Einstellungen ändern, indem Sie die Änderungen, die Änderungsmethode und das Format in der Methode "jcs.emit_change" angeben. Das Format ist derzeit nur XML.
Wenn ich dieses Skript ausführe, sieht es folgendermaßen aus:
[edit]
root@vmx1# show system time-zone
[edit]
root@vmx1# commit check
configuration check succeeds
[edit]
root@vmx1# show | compare
[edit system]
+ time-zone Asia/Tokyo;
Auf diese Weise wird die Zeitzone hinzugefügt, wenn das Commit-Skript ausgeführt wird.
Als nächstes werde ich ein Beispiel für die Implementierung eines sogenannten Makros vorstellen und die generierten Einstellungen auf dem Gerät transparent wiedergeben. Als Beispiel (ich kann mir kein einfaches und gutes Beispiel vorstellen) ist hier ein Beispiel eines Skripts, das die Standardbeschreibung einer Schnittstelle definiert und die Standardbeschreibung festlegt, wenn es eine Schnittstelle gibt, die keine Beschreibung enthält. Wird sein.
commit-script.py
from junos import Junos_Configuration
import jcs
def main():
root = Junos_Configuration
apply_macro = root.find("./interfaces/apply-macro[name='default-description']")
xml_tmpl = '<interfaces>{0}</interfaces>'
interface_xml_tmpl = '<interface><name>{0}</name><description>{1}</description></interface>'
xml = ""
if apply_macro:
description_template = apply_macro.find('./data/name').text
for element in root.findall("./interfaces/interface"):
if element.find('description') is None:
ifd_name = element.find('name').text
xml += interface_xml_tmpl.format(ifd_name, description_template.format(ifd_name))
xml = xml_tmpl.format(xml)
jcs.emit_change(xml, "transient-change", "xml")
if __name__ == '__main__':
main()
Wenn in diesem Skript das Makro "Standardbeschreibung" direkt unter "Schnittstellen" definiert ist, wird die Schnittstellenliste überprüft, und für Schnittstellen, für die "Beschreibung" nicht festgelegt ist, wird der im Makro "Standardbeschreibung" angegebene Text angegeben. Mach einen Zug.
Der Punkt zum Generieren von Änderungen in XML ist der gleiche wie zuvor, aber das zweite Argument von "jcs.emit_change" hat sich von "change" zu "transient-change" geändert. Dies ist eine Option, um die Einstellung als temporär zu behandeln und nicht in der Einstellungsdatei zu speichern.
Wie oben erwähnt, müssen bei Verwendung von "Transient-Change" die folgenden Einstellungen eingegeben werden.
set system scripts commit allow-transients
Wenn dieses Skript angewendet wird, verhält es sich wie folgt.
root@vmx1# show interfaces | display set
set interfaces apply-macro default-description "Description is not configured({0})"
set interfaces ge-0/0/0 disable
set interfaces ge-0/0/0 vlan-tagging
set interfaces ge-0/0/0 unit 1001 vlan-id 1001
set interfaces ge-0/0/0 unit 1001 family inet address 10.0.1.1/24
set interfaces ge-0/0/1 description test
set interfaces ge-0/0/1 unit 0 family inet
set interfaces fxp0 unit 0 family inet address 172.23.1.111/24
[edit]
root@vmx1# commit
commit complete
[edit]
root@vmx1# run show interfaces descriptions
Interface Admin Link Description
ge-0/0/0 down down Description is not configured(ge-0/0/0)
ge-0/0/1 up down test
fxp0 up up Description is not configured(fxp0)
[edit]
root@vmx1# run show configuration interfaces | display set
set interfaces apply-macro default-description "Description is not configured({0})"
set interfaces ge-0/0/0 disable
set interfaces ge-0/0/0 vlan-tagging
set interfaces ge-0/0/0 unit 1001 vlan-id 1001
set interfaces ge-0/0/0 unit 1001 family inet address 10.0.1.1/24
set interfaces ge-0/0/1 description test
set interfaces ge-0/0/1 unit 0 family inet
set interfaces fxp0 unit 0 family inet address 172.23.1.111/24
Kannst du den Unterschied zum vorherigen sehen? In # 2 wurden die Einstellungen während der Festschreibungsprüfung geändert, und die Änderungen wurden in den Einstellungen angezeigt. Wenn Sie dagegen "transient-change" verwenden, scheint die Konfiguration auf den ersten Blick nicht geändert worden zu sein. Wenn Sie jedoch den tatsächlichen Vorgang überprüfen, können Sie sehen, dass die Beschreibung in Interface festgelegt ist.
Mit "Transient-Change" ist es möglich, die Einstellungen auf diese Weise zu makroökonomisieren und die tatsächlichen Geräteeinstellungen außer den wesentlichen Parametern auszublenden. Wenn beispielsweise eine große Anzahl von Kunden vorhanden ist und eine große Anzahl von Einstellungen erforderlich ist, die Unterschiede zwischen den Kunden jedoch unbedeutend sind, können Einstellungen effizient und mit guter Sichtbarkeit vorgenommen werden.
Übrigens, wenn Sie die Einstellungen überprüfen möchten, die tatsächlich auf dem Gerät ausgeführt werden, können Sie Folgendes überprüfen.
root@vmx1> show configuration interfaces | display set | display commit-scripts
set interfaces apply-macro default-description "Description is not configured({0})"
set interfaces ge-0/0/0 description "Description is not configured(ge-0/0/0)"
set interfaces ge-0/0/0 disable
set interfaces ge-0/0/0 vlan-tagging
set interfaces ge-0/0/0 unit 1001 vlan-id 1001
set interfaces ge-0/0/0 unit 1001 family inet address 10.0.1.1/24
set interfaces ge-0/0/1 description test
set interfaces ge-0/0/1 unit 0 family inet
set interfaces fxp0 description "Description is not configured(fxp0)"
set interfaces fxp0 unit 0 family inet address 172.23.1.111/24
Dieses Mal habe ich Commit Script als eine der Anwendungen von Junoscript von On-Box Python eingeführt. Ich hoffe, Sie können verstehen, dass es verschiedene Möglichkeiten gibt, es zu verwenden. Die diesmal eingeführten Inhalte können nur mit XSLT / Slax implementiert werden, aber ich denke, dass es möglich geworden ist, in Python zu schreiben, und dass es sehr einfach geworden ist, sich einzubringen.
Das nächste Mal möchte ich vorstellen, wie es im Ereignisskript verwendet wird.
Recommended Posts