Beispiel: Verwenden von Junos PyEZ zum Laden von Konfigurationsdaten aus einer Datei
Mit der Junos PyEZ-Bibliothek können Sie Betriebs- und Konfigurationsaufgaben auf Junos-Geräten ausführen. In diesem Beispiel wird das Dienstprogramm Junos PyEZ jnpr.junos.utils.config.Config
verwendet, um Konfigurationsdaten aus einer lokalen Datei auf dem Konfigurationsverwaltungsserver auf ein Junos-Gerät zu laden.
Anforderungen
In diesem Beispiel werden die folgenden Hardware- und Softwarekomponenten verwendet:
Konfigurationsverwaltungsserver mit Python 3.5 oder höher und Junos PyEZ Version 2.0 oder höher
Junos-Gerät mit aktiviertem NETCONF und einem mit den entsprechenden Berechtigungen konfigurierten Benutzerkonto
Öffentliches/privates SSH-Schlüsselpaar, das für den entsprechenden Benutzer auf dem Server und dem Junos-Gerät konfiguriert ist
Übersicht
Dieses Beispiel zeigt eine Python-Anwendung, die das Dienstprogramm Junos PyEZ Config
verwendet, um ein neues Op-Skript in der Konfiguration des angegebenen Geräts zu aktivieren. Die Datei junos-config-add-op-script.conf , die sich auf dem Konfigurationsmanagement-Server befindet, enthält die relevanten Konfigurationsdaten im ASCII-Format.
Die Python-Anwendung importiert die Klasse, die Device
die Verbindung mit dem Junos-Gerät verarbeitet, die Klasse, die Config
verwendet wird, um unstrukturierte Konfigurationsänderungen auf dem Zielgerät vorzunehmen, und erforderliche Ausnahmen aus dem jnpr.junos.exception
Modul, das Ausnahmen enthält, die bei der Verwaltung von Junos-Geräten auftreten. In diesem Beispiel wird die Config
Instanz an die Device
Instanz gebunden, anstatt eine eigenständige Variable für die Instanz der Config
Klasse zu erstellen.
Nachdem die Device
Instanz für das Zielgerät erstellt wurde, stellt die open()
Methode eine Verbindung und eine NETCONF-Sitzung mit dem Gerät her. Die Config
Hilfsmethoden sperren dann die Kandidatenkonfiguration, laden die Konfigurationsänderungen als Vorgang load merge
in die Kandidatenkonfiguration, führen einen Commit für die Kandidatenkonfiguration aus und entsperren sie dann.
Der load()
Parameter method path
wird auf den Pfad der Konfigurationsdatei gesetzt. Da die Konfigurationsdateierweiterung das Format der Konfigurationsdaten angibt, wird der format
Parameter in der Argumentliste weggelassen. Einstellung merge=True
gibt an, dass das Gerät einen load merge
Vorgang ausführen soll.
Nachdem die Konfigurationsvorgänge abgeschlossen sind, ruft die Anwendung die close()
Methode auf, um die NETCONF-Sitzung und -Verbindung zu beenden. Die Anwendung enthält Code zum Behandeln von Ausnahmen, z. B LockError
. für Fehler, die beim Sperren der Konfiguration auftreten, und CommitError
für Fehler, die während des Commit-Vorgangs auftreten. Die Anwendung enthält auch Code zum Behandeln zusätzlicher Ausnahmen, die auftreten können.
Konfiguration
Erstellen der Konfigurationsdatendatei
Schritt-für-Schritt-Anleitung
So erstellen Sie die Konfigurationsdatendatei, die von der Junos PyEZ-Anwendung verwendet wird:
Erstellen Sie eine neue Datei mit der entsprechenden Erweiterung, die auf dem Format der Konfigurationsdaten basiert, in diesem Beispiel ASCII-Text.
Fügen Sie die gewünschten Konfigurationsänderungen in die Datei ein, z. B.:
system { scripts { op { file bgp-neighbors.slax; } } }
Erstellen der Junos PyEZ-Anwendung
Schritt-für-Schritt-Anleitung
So erstellen Sie eine Python-Anwendung, die Junos PyEZ verwendet, um Konfigurationsänderungen auf einem Junos-Gerät vorzunehmen:
Importieren Sie alle erforderlichen Module, Klassen und Objekte.
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from jnpr.junos.exception import LockError from jnpr.junos.exception import UnlockError from jnpr.junos.exception import ConfigLoadError from jnpr.junos.exception import CommitError
Fügen Sie alle erforderlichen Variablen ein, die in diesem Beispiel den Hostnamen des verwalteten Geräts und den Pfad zu der Datei mit den Konfigurationsdaten enthalten.
host = 'dc1a.example.com' conf_file = 'configs/junos-config-add-op-script.conf'
Erstellen Sie eine Funktionsdefinition und einen
main()
Funktionsaufruf, und platzieren Sie die restlichen Anweisungen in der Definition.def main(): if __name__ == "__main__": main()
Erstellen Sie eine Instanz der
Device
Klasse, und geben Sie den Hostnamen und alle Parameter an, die für diese spezifische Verbindung erforderlich sind.Öffnen Sie dann eine Verbindung, und stellen Sie eine NETCONF-Sitzung mit dem Gerät her.
# open a connection with the device and start a NETCONF session try: dev = Device(host=host) dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) return
Binden Sie die
Config
Instanz an dieDevice
Instanz.dev.bind(cu=Config)
Sperren Sie die Konfiguration.
# Lock the configuration, load configuration changes, and commit print ("Locking the configuration") try: dev.cu.lock() except LockError as err: print ("Unable to lock configuration: {0}".format(err)) dev.close() return
Laden Sie die Konfigurationsänderungen, und behandeln Sie alle Fehler.
print ("Loading configuration changes") try: dev.cu.load(path=conf_file, merge=True) except (ConfigLoadError, Exception) as err: print ("Unable to load configuration changes: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return
Bestätigen Sie die Konfiguration.
print ("Committing the configuration") try: dev.cu.commit(comment='Loaded by example.') except CommitError as err: print ("Unable to commit configuration: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return
Entsperren Sie die Konfiguration.
print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err))
Beenden Sie die NETCONF-Sitzung, und beenden Sie die Verbindung mit dem Gerät.
# End the NETCONF session and close the connection dev.close()
Ergebnisse
Überprüfen Sie auf dem Konfigurationsverwaltungsserver die abgeschlossene Anwendung. Wenn die Anwendung nicht den gewünschten Code anzeigt, wiederholen Sie die Anweisungen in diesem Beispiel, um die Anwendung zu korrigieren.
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from jnpr.junos.exception import LockError from jnpr.junos.exception import UnlockError from jnpr.junos.exception import ConfigLoadError from jnpr.junos.exception import CommitError host = 'dc1a.example.com' conf_file = 'configs/junos-config-add-op-script.conf' def main(): # open a connection with the device and start a NETCONF session try: dev = Device(host=host) dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) return dev.bind(cu=Config) # Lock the configuration, load configuration changes, and commit print ("Locking the configuration") try: dev.cu.lock() except LockError as err: print ("Unable to lock configuration: {0}".format(err)) dev.close() return print ("Loading configuration changes") try: dev.cu.load(path=conf_file, merge=True) except (ConfigLoadError, Exception) as err: print ("Unable to load configuration changes: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return print ("Committing the configuration") try: dev.cu.commit(comment='Loaded by example.') except CommitError as err: print ("Unable to commit configuration: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err)) # End the NETCONF session and close the connection dev.close() if __name__ == "__main__": main()
Ausführen der Junos PyEZ-Anwendung
Ausführen der Anwendung
-
Führen Sie die Anwendung auf dem Konfigurationsverwaltungsserver aus.
user@server:~$ python3 junos-pyez-config.py Locking the configuration Loading configuration changes Committing the configuration Unlocking the configuration
Überprüfung
Überprüfen Sie die Konfiguration
Zweck
Vergewissern Sie sich, dass die Konfiguration auf dem Junos-Gerät korrekt aktualisiert wurde.
Aktion
Melden Sie sich beim Junos-Gerät an und zeigen Sie die Konfiguration, den Commit-Verlauf und die Protokolldateien an, um die Konfiguration und den Commit zu überprüfen. Zum Beispiel:
user@dc1a> show configuration system scripts op { file bgp-neighbors.slax; }
user@dc1a> show system commit 0 2014-07-29 14:40:50 PDT by user via netconf ...
user@dc1a> show log messages Jul 29 14:40:36 dc1a sshd[75843]: Accepted publickey for user from 198.51.100.1 port 54811 ssh2: RSA 02:dd:53:3e:f9:97:dd:1f:d9:31:e9:7f:82:06:aa:67 Jul 29 14:40:36 dc1a sshd[75843]: subsystem request for netconf by user user Jul 29 14:40:42 dc1a file[75846]: UI_COMMIT: User 'user' requested 'commit' operation (comment: Loaded by example.) Jul 29 14:40:45 dc1a mspd[75888]: mspd: No member config Jul 29 14:40:45 dc1a mspd[75888]: mspd: Building package info Jul 29 14:40:51 dc1a mspd[1687]: mspd: No member config Jul 29 14:40:51 dc1a mspd[1687]: mspd: Building package info Jul 29 14:40:51 dc1a file[75846]: UI_COMMIT_COMPLETED: commit complete
Bedeutung
Die Konfiguration und der Inhalt der Protokolldatei geben an, dass die richtigen Konfigurationsanweisungen erfolgreich konfiguriert und auf dem Gerät festgeschrieben wurden.
Problembehandlung
- Beheben von Timeout-Fehlern
- Beheben von Fehlern bei der Konfigurationssperre
- Beheben von Konfigurationsänderungsfehlern
Beheben von Timeout-Fehlern
Problem
Der Junos PyEZ-Code generiert eine RpcTimeoutError-Meldung oder eine TimeoutExpiredError-Meldung und kann die Gerätekonfiguration nicht aktualisieren.
RpcTimeoutError(host: dc1a.example.com, cmd: commit-configuration, timeout: 30)
Die Standardzeit für ein Timeout eines NETCONF-RPCs beträgt 30 Sekunden. Große Konfigurationsänderungen können diesen Wert überschreiten, was zu einer Zeitüberschreitung des Vorgangs führt, bevor die Konfiguration hochgeladen und festgeschrieben werden kann.
Lösung
Um Konfigurationsänderungen zu berücksichtigen, die möglicherweise eine Commitzeit erfordern, die länger als das Standardtimeoutintervall ist, legen Sie das Timeoutintervall auf einen geeigneten Wert fest, und führen Sie den Code erneut aus. Um das Intervall zu konfigurieren, legen Sie entweder die Device
timeout
Eigenschaft auf einen geeigneten Wert fest, oder schließen Sie das Argument timeout=seconds
ein, wenn Sie die Methode aufrufen, um einen commit()
Commit für die Konfigurationsdaten auf einem Gerät auszuführen. Zum Beispiel:
dev = Device(host="host") dev.open() dev.timeout = 300 ... dev.cu.commit(timeout=360)
Beheben von Fehlern bei der Konfigurationssperre
Problem
Der Junos PyEZ-Code generiert eine LockError-Meldung, die darauf hinweist, dass die Konfiguration nicht gesperrt werden kann. Zum Beispiel:
LockError(severity: error, bad_element: None, message: configuration database modified)
Ein Konfigurationssperrfehler kann aus folgenden Gründen auftreten:
Ein anderer Benutzer hat eine exklusive Sperre für die Konfiguration.
Für die freigegebene Konfigurationsdatenbank wurden Änderungen vorgenommen, für die kein Commit ausgeführt wurde.
Der Benutzer, der den Junos PyEZ-Code ausführt, verfügt nicht über die Berechtigung zum Konfigurieren des Geräts.
Lösung
Wenn ein anderer Benutzer über eine exklusive Sperre für die Konfiguration verfügt oder die Konfiguration geändert hat, warten Sie, bis die Sperre aufgehoben oder die Änderungen festgeschrieben wurden, und führen Sie den Code erneut aus. Wenn die Ursache des Problems darin besteht, dass der Benutzer nicht über die Berechtigungen zum Konfigurieren des Geräts verfügt, führen Sie die Anwendung entweder mit einem Benutzer aus, der über die erforderlichen Berechtigungen verfügt, oder konfigurieren Sie ggf. das Junos-Gerät so, dass dem aktuellen Benutzer die erforderlichen Berechtigungen zum Vornehmen der Änderungen erteilt werden.
Beheben von Konfigurationsänderungsfehlern
Problem
Der Junos PyEZ-Code generiert eine ConfigLoadError-Meldung, die darauf hinweist, dass die Konfiguration aufgrund eines Berechtigungsproblems nicht geändert werden kann.
ConfigLoadError(severity: error, bad_element: scripts, message: permission denied)
Diese Fehlermeldung wird möglicherweise generiert, wenn der Benutzer, der den Junos PyEZ-Code ausführt, über die Berechtigung zum Ändern der Konfiguration verfügt, aber nicht über die Berechtigung verfügt, den gewünschten Teil der Konfiguration zu ändern.
Lösung
Führen Sie die Anwendung entweder mit einem Benutzer aus, der über die erforderlichen Berechtigungen verfügt, oder konfigurieren Sie ggf. das Junos-Gerät, um dem aktuellen Benutzer die erforderlichen Berechtigungen zum Vornehmen der Änderungen zu erteilen.