Versuchen Sie es mit Junos 'On-Box Python # 2 Commit Script

Überblick

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.

Was ist ein Commit-Skript?

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.

Aufbau

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.

Beispiel 1: Festschreiben einer Konfiguration ablehnen, die nicht die erforderlichen Einstellungen enthält

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".

Beispiel 2: Ändern Sie die Einstellungen

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.

Beispiel 3: Dynamische Generierung von Einstellungen und nicht persistente Anwendung

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

abschließend

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

Versuchen Sie es mit Junos 'On-Box Python # 2 Commit Script
Versuchen Sie es mit Junos 'On-Box Python # 1 Op Script
Versuchen Sie es mit Junos 'On-Box Python #Bonus 1 So etwas wie ChatOps / Commit und posten Sie es bei Slack
Versuchen Sie es mit Tweepy [Python2.7]
[Python] Versuchen Sie, Tkinters Leinwand zu verwenden
Versuchen Sie es mit Kubernetes Client -Python-
Versuchen Sie es mit der Pleasant-API (Python / FastAPI).
Versuchen Sie es mit LevelDB mit Python (plyvel)
Versuchen Sie es mit der Aktions-API von Python argparse
Versuchen Sie es mit dem Python Cmd-Modul
Versuchen Sie es mit LeapMotion mit Python
Versuchen Sie es mit Amazon DynamoDB von Python
Versuchen Sie Python
Versuchen Sie eine Formel mit Σ mit Python
Versuchen Sie, die Kraken-API mit Python zu verwenden
Dialogflow (früher: API.AI) Verwenden Sie das Python SDK #dialogflow
Versuchen Sie, Python mit Google Cloud-Funktionen zu verwenden
Versuchen Sie, Excel mit Python (Xlwings) zu betreiben.
Skript-Python-Datei
Versuchen Sie es mit Docker-Py
Python-Skript-Skelett
Versuchen Sie es mit einem Ausstecher
Versuchen Sie es mit PDFMiner
Versuchen Sie es mit der BitFlyer Ligntning API in Python
Python-Skript-Profilerstellung
Python: Versuchen Sie, die Benutzeroberfläche von Pythonista 3 auf dem iPad zu verwenden
Starten Sie Python
Importieren Sie ein Python-Skript
Versuchen Sie es mit Selen
Versuchen Sie es mit scipy
Python> try: / außer:
Versuchen Sie es mit dem Python-Webframework Tornado Part 1
Versuchen Sie es mit pandas.DataFrame
Hinweis zum Ausprobieren von Juniper JUNOS PyEz (Python-Bibliothek) 1 ~ PyEz Übersicht ~
Versuchen Sie es mit dem Sammlungsmodul (ChainMap) von python3
Versuchen Sie es mit Tensorflow. ① Erstellen Sie eine Python-Umgebung und führen Sie Tensorflow ein
Versuchen Sie es mit Django-Swiftbrowser
Versuchen Sie es mit matplotlib
Versuchen Sie es mit dem Python-Webframework Tornado Part 2
Versuchen Sie es mit tf.metrics
Versuchen Sie es mit PyODE
Führen Sie Python-Skripte in Excel aus (mit xlwings).
Scraping mit Python
Versuchen Sie, die ChatWork-API und die Qiita-API in Python zu verwenden
Versuchen Sie, die DropBox Core-API mit Python zu verwenden
Versuchen Sie, eine komprimierte Datei mit Python und zlib zu erstellen
(Python) Versuchen Sie, eine Webanwendung mit Django zu entwickeln
Versuchen Sie, die Bildkonvertierung mit OpenCV mit Python zu projizieren
Versuchen Sie, hochfrequente Wörter mit NLTK (Python) zu extrahieren.
Versuchen Sie es mit Python.
Bearbeiten Sie Redmine mit Python Redmine
Fibonacci-Sequenz mit Python
Python versuchen ~ außer ~ sonst
Datenbereinigung mit Python
[Azure] Versuchen Sie, Azure-Funktionen zu verwenden
Versuchen Sie Debian + Python 3.4 + django1.7 ……
Verwenden von Python # externen Paketen
Versuchen Sie es jetzt mit virtualenv
DynamoDB Script Memo (Python)