Verwenden von Junos PyEZ-Konfigurationstabellen zum Abrufen von Konfigurationsdaten
Junos PyEZ-Konfigurationstabellen und -ansichten bieten eine einfache und effiziente Möglichkeit, spezifische Informationen aus der ausgewählten Konfigurationsdatenbank eines Junos-Geräts zu extrahieren. Nachdem Sie die Tabellendefinition in Ihr Python-Modul geladen oder importiert haben, können Sie die Konfigurationsdaten abrufen.
Junos PyEZ-Konfiguration Tabellen, die die get
Eigenschaft angeben, können nur Konfigurationsdaten abrufen. Tabellen, die die set
Eigenschaft angeben, können Ressourcen auf Junos-Geräten konfigurieren und Daten auf die gleiche Weise abrufen wie Tabellen, die die get
Eigenschaft angeben.
Um Informationen von einem bestimmten Gerät abzurufen, müssen Sie eine Table-Instanz erstellen und sie dem Objekt zuordnen, das Device
das Zielgerät darstellt. Zum Beispiel:
from jnpr.junos import Device from myTables.ConfigTables import UserTable with Device(host='router.example.com') as dev: users = UserTable(dev)
In den folgenden Abschnitten wird erläutert, wie Sie die Daten anschließend abrufen und bearbeiten können:
Abrufen von Konfigurationselementen
Die Konfigurationstabelle get
oder set
-eigenschaft gibt die Daten an, die aus der Konfiguration extrahiert werden sollen. In der folgenden Beispiel-Tabellendefinition werden z. B. Elemente auf der Ebene der [edit system login]
Konfigurationshierarchie extrahiertuser
:
UserTable: get: system/login/user view: UserView UserView: fields: username: name userclass: class
Sie rufen die Konfigurationsdaten in Ihrem Python-Skript ab, indem Sie die get()
Methode aufrufen und alle gewünschten Argumente angeben.
from jnpr.junos import Device from myTables.ConfigTables import UserTable with Device(host='router.example.com') as dev: users = UserTable(dev) users.get()
Wenn die Tabellendefinition den required_keys
Parameter enthält, müssen Sie Schlüssel-Wert-Paare für jeden erforderlichen Schlüssel in die get()
Methodenargumentliste aufnehmen. Die folgende Tabellendefinition erfordert, dass die get()
Methodenargumentliste ein user
Argument mit einem Wert enthält, der dem Wert eines name
Elements auf Hierarchieebene [edit system login user]
entspricht:
UserTable: get: system/login/user required_keys: user: name view: UserView
In der get()
Methode müssen Sie den erforderlichen Schlüssel in die Argumentliste aufnehmen. Andernfalls löst der Code eine ValueError-Ausnahme aus. Im folgenden Beispiel werden die Konfigurationsdaten für den Benutzer mit dem Namen "operator" angefordert:
users = UserTable(dev).get(user='operator')
Wenn der Argumentname mit Bindestrich versehen ist, müssen Sie alle Bindestriche im Namen in Unterstriche ändern. Der Argumentwert ist jedoch eine Zeichenfolge und kann als solche Bindestriche enthalten.
Sie können das get()
Methodenargument namesonly=True
einschließen, um Konfigurationsdaten zurückzugeben, die nur Namensschlüssel auf der Hierarchieebene enthalten, die in der get
Eigenschaft or set
der Tabellendefinition angegeben ist.
from jnpr.junos import Device from myTables.ConfigTables import InterfaceTable with Device(host='router.example.com') as dev: interfaces = InterfaceTable(dev) interfaces.get(namesonly=True)
Angenommen get
, es ist beispielsweise definiert, um Konfigurationsdaten auf Hierarchieebene interfaces/interface
abzurufen, und Sie schließen das namesonly=True
Argument in die get()
Methode ein, wenn Sie die Daten in Ihrem Junos PyEZ-Skript abrufen. In diesem Fall gibt die Methode nur die Werte in den Elementen zurück, die <name>
direkte untergeordnete Elemente der interfaces/interface
Hierarchieebene sind. Informationen in Elementen, die <name>
gleichgeordnete Elemente des Elements sind, werden nicht zurückgegeben, und Daten für Elemente auf <name>
niedrigeren Ebenen in der Hierarchie werden nicht zurückgegeben.
Angeben der Konfigurationsdatenbank
Standardmäßig rufen Junos PyEZ-Konfigurationstabellen Daten aus der Kandidatenkonfigurationsdatenbank ab. Wenn Sie die get()
Methode im Python-Skript aufrufen, um die Tabellendaten abzurufen, können Sie angeben, dass die Methode stattdessen Daten aus der festgeschriebenen Konfigurationsdatenbank zurückgeben soll, indem Sie das options
Argument übergeben und das 'database':'committed'
Element in das options
Wörterbuch aufnehmen.
table_options = {'inherit':'inherit', 'groups':'groups', 'database':'committed'} with Device(host='router.example.com') as dev: users = UserTable(dev) users.get(options = table_options)
Angeben von Vererbungs- und Gruppenoptionen
Sie können Vererbungs- und Gruppierungsoptionen beim Abrufen von Konfigurationsdaten mithilfe des options
Arguments in der get()
Methodenargumentliste steuern. Das options
Argument nimmt ein Wörterbuch entgegen und ist standardmäßig auf den folgenden Wert festgelegt, der Vererbung und Gruppen für die zurückgegebenen Konfigurationsdaten anwendet:
options = {'inherit': 'inherit', 'groups': 'groups'}
Wenn Sie das options
Argument in Ihrem Python-Skript nicht neu definieren, wird automatisch der Standardwert verwendet.
Die inherit
Option gibt an, wie die Konfigurationsdaten Anweisungen anzeigen, die in Konfigurationsgruppen und Schnittstellenbereichen definiert sind. Standardmäßig ist die 'inherit':'inherit'
Option enthalten, und die Konfigurationsdaten schließen Tag-Elemente, die von benutzerdefinierten Gruppen oder Schnittstellenbereichen geerbt wurden, in die erbenden Tag-Elemente ein, anstatt die <apply-groups-except>
<groups>
<apply-groups>
, , oder <interface-range>
-Elemente separat anzuzeigen. Um die Vererbung anzuwenden, aber auch Tag-Elemente für Anweisungen einzuschließen, die in der junos-defaults
Gruppe definiert sind, verwenden Sie 'inherit':'defaults'
im options
Argument.
Um die Vererbung zu deaktivieren, legen Sie den Wörterbuchwert auf eine leere Zeichenfolge fest.
{'inherit':''}
Wenn Sie sowohl die Option als 'groups':'groups'
auch einschließen'inherit':'inherit'
, werden Konfigurationsdaten zurückgegeben, die auch die Konfigurationsgruppe angeben, von der Elemente geerbt werden. Ein Element, das von einer bestimmten Gruppe geerbt wird, enthält das junos:group="source-group"
Attribut in seinem öffnenden Tag, wie im folgenden Beispiel gezeigt:
<configuration> <interfaces> <interface junos:group="re0"> <name junos:group="re0">fxp0</name> <unit junos:group="re0"> <name junos:group="re0">0</name> <family junos:group="re0"> <inet junos:group="re0"> <address junos:group="re0"> <name junos:group="re0">198.51.100.1/24</name> </address> </inet> </family> </unit> </interface> </interfaces> ... </configuration>
Um den Zugriff auf die Attribute in der Ansichtsdefinition zu ermöglichen, können Sie die entsprechende XPath-Syntax in die Feldzuordnung aufnehmen. Im folgenden Beispiel wird das ifgroup
Feld definiert und dem Attribut des Interface-Elements <name>
zugeordnetjunos:group
:
InterfaceTable: get: interfaces/interface view: InterfaceView InterfaceView: fields: ifname: name ifaddress: unit/family/inet/address/name ifgroup: name/@group
Junos PyEZ stellt auch den Operator bereit, bei dem group
es sich um eine Verknüpfungsmethode für den Zugriff auf das junos:group
Attribut eines Elements handelt. Im folgenden Beispiel wird das ifgroup
Feld definiert, das dem name
Element mit dem group
Operator zugeordnet wird. Wenn Sie innerhalb Ihres Skripts darauf zugreifen ifgroup
, verweist es auf den Wert für das Attribut, das junos:group
dem <name>
Element der Schnittstelle zugeordnet ist.
InterfaceTable: get: interfaces/interface view: InterfaceView InterfaceView: fields: ifname: name ifaddress: unit/family/inet/address/name ifgroup: { name : group }
Wenn ein Element nicht von einer Gruppe geerbt wird, ist der Wert eines Feldes, das auf das group
Attribut verweist, .None
Zugreifen auf Tabellenelemente
Nachdem Sie die Konfigurationselemente abgerufen haben, können Sie sie wie ein Python-Wörterbuch behandeln, sodass Sie Methoden in der Python-Standardbibliothek verwenden können, um auf die Elemente zuzugreifen und sie zu bearbeiten.
Rufen Sie die keys()
Methode auf, um die Liste der Wörterbuchschlüssel anzuzeigen, die den Namen der Konfigurationselemente entsprechen.
users = UserTable(dev).get() print (users.keys())
['user1', 'readonly']
Mit dem Python-Operator können Sie überprüfen, ob ein bestimmter Schlüssel in den Tabellenelementen in
vorhanden ist.
if 'readonly' in users:
Rufen Sie die values()
Methode auf, um eine Liste der Felder oder Werte anzuzeigen, die den einzelnen Schlüsseln zugeordnet sind. Die values()
Methode gibt eine Liste von Tupeln mit den Name-Wert-Paaren für jedes Feld zurück, das in der Ansicht definiert wurde.
print (users.values())
[[('username', 'user1'), ('userclass', 'super-user')], [('username', 'readonly'), ('userclass', 'read-only')]]
Rufen Sie die items()
Methode auf, um die vollständige Liste der Elemente, einschließlich Schlüssel und Werte, anzuzeigen.
print (users.items())
[('user1', [('username', 'user1'), ('userclass', 'super-user')]), ('readonly', [('username', 'readonly'), ('userclass', 'read-only')])]
Durchlaufen einer Tabelle
Tabellen unterstützen die Iteration, mit der Sie jedes Konfigurationselement auf die gleiche Weise durchlaufen können, wie Sie eine Liste oder ein Wörterbuch durchlaufen würden. So lassen sich gewünschte Felder schnell formatieren und drucken.
Die folgende Tabellendefinition extrahiert die system/login/user
Elemente aus den Konfigurationsdaten:
UserTable: get: system/login/user view: UserView UserView: fields: username: name userclass: class
Die folgende Junos PyEZ-Anwendung durchläuft die user
Elemente und gibt den Namen und die Klasse jedes Benutzers aus:
from jnpr.junos import Device from myTables.ConfigTables import UserTable with Device(host='router.example.com') as dev: users = UserTable(dev) users.get() for user in users: print("Username is {}\nUser class is {}".format(user.username, user.userclass))
Die username
Felder und userclass
, die in UserView definiert sind, entsprechen den Werten der name
Elemente und class
bzw. in den Konfigurationsdaten. Die Ausgabe enthält den Namen und die Klasse des Benutzers.
Username is user1 User class is super-user Username is readonly User class is read-only
Obwohl UserView ein username
Feld definiert, das dem name
Element zugeordnet ist, verfügt jedes View-Element standardmäßig über eine name
Eigenschaft, die auf den Schlüssel verweist, der dieses Element eindeutig identifiziert. Daher können Sie in diesem Beispiel auch verwenden user.name
, um auf den Wert des name
Elements zu verweisen.