Ich habe noch etwas Zeit, aber da ich die Umgebung erstellt und JUNOS-Informationen von letztes Mal erhalten habe, werde ich diesmal versuchen, die JUNOS-Einstellungen zu ändern. ..
Mithilfe des Moduls jnpr.junos.utils.config.Config von PyEz können Sie ASCII-Text-, Junos XML- oder Junos OS-Befehlsdateien festlegen, Einstellungen ändern und vorlagenbasierte Einstellungen mithilfe von Jinja2-Vorlagenobjekten festlegen. Kann gewechselt werden.
Wenn Sie die Einstellungen ändern, gehen Sie wie folgt vor: Lesen Sie die Einstellungen und spiegeln Sie sie durch Commit wider, genau wie bei der JUNOS CLI.
Configuration Process
Geben Sie zum Zeitpunkt des Festschreibens Option an Sie können auch einen Kommentar hinterlassen oder synchronisieren, wenn RE redundant ist.
Geben Sie zum Lesen der Einstellungen, wie z. B. Laden ersetzen, Zusammenführen laden oder Überschreiben von JUNOS CLI laden, Überschreiben an oder fügen Sie die Einstellungen hinzu und ändern Sie sie. Geben Sie während des Ladevorgangs die Parameter zum Zusammenführen und Überschreiben an (https://www.juniper.net/techpubs/en_US/junos-pyez1.2/topics/reference/general/junos-pyez-configuration- Kann ausgewählt werden durch (process-and-data-formats.html).
Dieses Mal werde ich die Methode zum Lesen einer ASCII-Textdatei und zum Hinzufügen von Einstellungen sowie die Methode zum Hinzufügen von vorlagenbasierten Einstellungen mit Jinja2 ausprobieren.
Erweiterung zum Laden der Datei (https://www.juniper.net/techpubs/en_US/junos-pyez1.2/topics/task/program/junos-pyez-program-configuration-data-loading.html) Geben Sie ASCII-Text (.conf, .text, .txt), Junos-Befehl set (.set) und XML (.xml) als untergeordnete Elemente an.
Zum Zeitpunkt des Lesens wird die Datei gelesen, indem der Pfad der Datei mit dem Parameter path angegeben wird. Zum Beispiel
conf_file = "configs/junos-config-add-syslog-ntp.conf"
cu.load(path=conf_file, format="text", merge=True)
Als Beispiel wird der Fall gezeigt, in dem das Hinzufügen der NTP-Benachrichtigungseinstellung von Syslog von PyEz durchgeführt wird. Bereiten Sie zusätzlich zur Python-Datei eine Konfigurationsdatei zum Lesen vor.
junos-config-add-syslog-ntp.conf
system {
syslog {
file messages {
ntp notice;
}
}
}
Hier ist ein Python-Beispiel.
ch-config-ntp.py
from jnpr.junos import Device
from jnpr.junos.utils.config import Config
conf_file = 'configs/junos-config-add-syslog-ntp.conf'
# open a connection with the device and start a NETCONF session
dev = Device(host='10.0.0.243', user='xxx', password='xxx', port='22', gather_facts=False)
dev.open()
dev.bind(cu=Config)
# Lock the configuration, load configuration changes, and commit as load merge
print "Locking the configuration"
dev.cu.lock()
print "Loading configuration changes"
dev.cu.load(path=conf_file, merge=True)
print "Committing the configuration"
dev.cu.commit(comment='Loaded by example.')
print "Unlocking the configuration"
dev.cu.unlock()
# End the NETCONF session and close the connection
dev.close()
Eine Ausnahme ist auch im Modul jnpr.junos.exception verfügbar. Um den Fehler zu überprüfen, wenn er nicht ausgeführt werden konnte, sehen Sie ihn daher wie folgt aus, wenn Sie ihn in jedem Prozess ausschließen.
ch-config-ntp-exception.py
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
conf_file = 'configs/junos-config-add-syslog-ntp.conf'
def main():
# open a connection with the device and start a NETCONF session
try:
dev = Device(host='10.0.0.243', user='xxxx', password='xxxx', port='22
', gather_facts=False)
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()
Mit Jinja2 können Sie auf einfache Weise ähnliche Konfigurationen mithilfe von Vorlagen erstellen. Jinja2 ist eine Python-Vorlagen-Engine, und Herkunft des Namens scheint eine Vorlage ⇒ Tempel ⇒ Schrein zu sein. Jinja2-Vorlagen verwenden ASCII-Text, Junos XML-Elemente und Junos OS-Set-Befehle in unterstützten Formaten, genau wie das Lesen von Dateien. Im Format der Jinja-Vorlage sind {% ...%} und {{...}} variable Teile. Und alle anderen Teile sind feste Sätze. {% ...%} führt die Deklaration / Zuweisung von Variablen, die Schleifenverarbeitung usw. aus. {{...}} ist die Ergebnisanzeige Siehe hier für die Kontrollstrukturen, die für {% verwendet werden.
Verwenden Sie zur Verwendung der Vorlage die load () -Methode [Options](https://www.juniper.net/techpubs/en_US/junos-pyez1.2/topics/task/program/junos-pyez-program-configuration- Geben Sie die Vorlage in data-load.html an. Geben Sie die Vorlagendatei mit template_path an und geben Sie die Parameter mit template_vars an.
cu.load(template_path=conf_file, template_vars=config, merge=True)
Verwenden Sie dieses Mal eine Vorlage, die jeder Schnittstelle Einstellungen für MPLs und Rsvp hinzufügt, und lesen Sie die Namen der Parameterschnittstellen usw. in einer yaml-Datei. Die Vorlage ist auch ASCII-Text.
Klicken Sie hier für die Vorlagendatei
junos-config-interfaces-mpls.conf
interfaces {
{% for item in interfaces %}
{{ item }} {
description "{{ description }}";
unit 0 {
family {{ family }};
}
} {% endfor %}
}
protocols {
mpls {
{% for item in interfaces %}
interface {{ item }};
{% endfor %}
}
rsvp {
{% for item in interfaces %}
interface {{ item }};
{% endfor %}
}
}
Klicken Sie hier für die Parameterdatei
mpls_interface.yml
---
interfaces:
- ge-0/0/0
- ge-0/0/1
description: 'MPLS interface'
family: mpls
Grundsätzlich werden basierend auf demselben Skript (ch-config-ntp-exception.py) wie beim Lesen der Datei nur die Vorlage und die Parameter von load () angegeben, sodass nur die verschiedenen Teile extrahiert werden.
add-config-mpls-template.py Auszug
import yaml
conf_file = 'configs/junos-config-interfaces-mpls.conf'
yml_config = yaml.load(open('configs/mpls_interface.yml'))
dev.cu.load(template_path=conf_file, template_vars=yml_config, merge=Tru
e)
Damit können die Einstellungen von mpls und rsvp für die angegebene Schnittstelle hinzugefügt werden.
Diesmal habe ich viel geschrieben, aber ich konnte bestätigen, dass die JUNOS-Einstellungen mit PyEz geändert werden können. In PyEz sind neben der Erfassung und Änderung von Informationen auch ein Konfigurationsvergleich, ein Betriebssystem-Upgrade, eine Dateiübertragung per SCP usw. möglich.
Es mag schwierig sein, JUNOS und PyEz zu verstehen, aber selbst Ingenieure, die nicht mit Python vertraut sind, können die erforderlichen Parameter leicht überprüfen und die Einstellungen ändern. Wenn Sie einen Mechanismus erstellen, mit dem Sie mit diesen auf das Web zugreifen können, können auch nicht erfahrene Netzwerktechniker dies überprüfen und ändern. Durch die Verknüpfung mit anderen Systemen können Sie die Einstellungen je nach Situation dynamisch ändern. Die Verwendungsmethoden werden wahrscheinlich in Abhängigkeit von Ideen wie der Schaffung einer Infrastruktur erweitert.
In Zukunft plane ich, andere Automation Stacks unregelmäßig auszuprobieren.
Recommended Posts