Uso de las tablas de configuración de Junos PyEZ para recuperar datos de configuración
Las tablas y vistas de configuración de Junos PyEZ proporcionan una manera sencilla y eficaz de extraer información específica de la base de datos de configuración seleccionada de un dispositivo Junos. Después de cargar o importar la definición de tabla en el módulo de Python, puede recuperar los datos de configuración.
Configuración de Junos PyEZ Las tablas que especifican la propiedad solo pueden recuperar datos de get
configuración. Las tablas que especifican la set
propiedad pueden configurar recursos en dispositivos Junos, así como recuperar datos de la misma manera que las tablas que especifican la get
propiedad.
Para recuperar información de un dispositivo específico, debe crear una instancia de tabla y asociarla al Device
objeto que representa el dispositivo de destino. Por ejemplo:
from jnpr.junos import Device from myTables.ConfigTables import UserTable with Device(host='router.example.com') as dev: users = UserTable(dev)
En las secciones siguientes se explica cómo recuperar y manipular los datos:
Recuperar elementos de configuración
La tabla get
o set
propiedad de configuración identifica los datos que se van a extraer de la configuración. Por ejemplo, la siguiente definición de tabla de ejemplo extrae elementos en el nivel de user
jerarquía de [edit system login]
configuración:
UserTable: get: system/login/user view: UserView UserView: fields: username: name userclass: class
Los datos de configuración se recuperan en la secuencia de comandos de Python llamando al get()
método y proporcionando los argumentos deseados.
from jnpr.junos import Device from myTables.ConfigTables import UserTable with Device(host='router.example.com') as dev: users = UserTable(dev) users.get()
Si la definición de tabla incluye el required_keys
parámetro, debe incluir pares clave-valor para cada clave necesaria en la lista de argumentos del get()
método. La siguiente definición de tabla requiere que la lista de argumentos del get()
método incluya un user
argumento con un valor que corresponda al valor de un name
elemento en el [edit system login user]
nivel de jerarquía:
UserTable: get: system/login/user required_keys: user: name view: UserView
En el get()
método, debe incluir la clave necesaria en la lista de argumentos; de lo contrario, el código produce una excepción ValueError. En el ejemplo siguiente se solicitan los datos de configuración para el usuario denominado 'operator':
users = UserTable(dev).get(user='operator')
Si el nombre del argumento tiene guiones, debe cambiar los guiones del nombre a guiones bajos. El valor del argumento, sin embargo, es una cadena y, como tal, puede contener guiones.
Puede incluir el argumento método namesonly=True
get()
para devolver datos de configuración que contengan solo claves de nombre en el nivel de jerarquía especificado en la propiedad o set
de la get
definición de tabla.
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)
Por ejemplo, supongamos get
que se define para recuperar datos de configuración en el nivel de interfaces/interface
jerarquía e incluye el namesonly=True
argumento en el get()
método cuando recupera los datos en el script de Junos PyEZ. En este caso, el método devuelve sólo los valores de los <name>
elementos que son hijos directos del interfaces/interface
nivel jerárquico. No se devuelve la información de los <name>
elementos que son elementos del mismo nivel y no se devuelven los datos de <name>
los elementos de niveles inferiores de la jerarquía.
Especificar la base de datos de configuración
De forma predeterminada, las tablas de configuración de Junos PyEZ recuperan datos de la base de datos de configuración candidata. Cuando llame get()
al método en la secuencia de comandos de Python para recuperar los datos de la tabla, puede especificar que el método devuelva datos de la base de datos de configuración confirmada pasando el options
argumento e incluyendo el 'database':'committed'
elemento en el options
diccionario.
table_options = {'inherit':'inherit', 'groups':'groups', 'database':'committed'} with Device(host='router.example.com') as dev: users = UserTable(dev) users.get(options = table_options)
Especificar opciones de herencia y grupo
Puede controlar las opciones de herencia y grupo al recuperar datos de configuración mediante el argumento de la lista de argumentos de options
método get()
. El options
argumento toma un diccionario y, de forma predeterminada, se establece en el siguiente valor, que aplica la herencia y los grupos para los datos de configuración devueltos:
options = {'inherit': 'inherit', 'groups': 'groups'}
Si no redefine el argumento en el script de options
Python, automáticamente utiliza el valor predeterminado.
La inherit
opción especifica cómo los datos de configuración muestran instrucciones definidas en grupos de configuración y rangos de interfaz. De forma predeterminada, se incluye la 'inherit':'inherit'
opción y los datos de configuración incluyen elementos de etiqueta heredados de grupos definidos por el usuario o rangos de interfaz dentro de los elementos de etiqueta heredados, <apply-groups>
<apply-groups-except>
en lugar de mostrar los <groups>
, , o <interface-range>
elementos por separado. Para aplicar la herencia, pero también incluir elementos de etiqueta para las instrucciones definidas en el junos-defaults
grupo, úselas 'inherit':'defaults'
en el options
argumento.
Para deshabilitar la herencia, establezca el valor del diccionario en una cadena vacía.
{'inherit':''}
Al incluir las 'inherit':'inherit'
opciones y 'groups':'groups'
, se devuelven datos de configuración que también indican el grupo de configuración del que se heredan los elementos. Un elemento que se hereda de un grupo determinado incluye el junos:group="source-group"
atributo en su etiqueta de apertura, como se muestra en el ejemplo siguiente:
<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>
Para proporcionar acceso a los atributos de la definición de View, puede incluir la sintaxis XPath adecuada en la asignación de campos. En el junos:group
ejemplo siguiente se define el ifgroup
campo y se asigna al atributo del elemento de <name>
la interfaz:
InterfaceTable: get: interfaces/interface view: InterfaceView InterfaceView: fields: ifname: name ifaddress: unit/family/inet/address/name ifgroup: name/@group
Junos PyEZ también proporciona el group
operador, que es un método de acceso directo para acceder al junos:group
atributo de un elemento. En el ejemplo siguiente se define el ifgroup
campo, que se asigna al name
elemento con el group
operador. Cuando accede dentro ifgroup
del script, hace referencia al valor del junos:group
atributo asociado con el elemento de <name>
la interfaz.
InterfaceTable: get: interfaces/interface view: InterfaceView InterfaceView: fields: ifname: name ifaddress: unit/family/inet/address/name ifgroup: { name : group }
Si un elemento no se hereda de un grupo, el valor de un campo que hace referencia al group
atributo es None
.
Elementos de la tabla de acceso
Después de recuperar los elementos de configuración, puede tratarlos como un diccionario de Python, que le permite utilizar métodos en la biblioteca estándar de Python para obtener acceso a los elementos y manipularlos.
Para ver la lista de claves de diccionario correspondientes a los nombres de los elementos de configuración, llame keys()
al método.
users = UserTable(dev).get() print (users.keys())
['user1', 'readonly']
Puede comprobar que una clave específica está presente en los elementos de tabla mediante el operador de Python in
.
if 'readonly' in users:
Para ver una lista de los campos o valores asociados a cada clave, llame values()
al método. El values()
método devuelve una lista de tuplas con los pares nombre-valor para cada campo definido en la vista.
print (users.values())
[[('username', 'user1'), ('userclass', 'super-user')], [('username', 'readonly'), ('userclass', 'read-only')]]
Para ver la lista completa de elementos, incluidas las claves y los items()
valores, llame al método.
print (users.items())
[('user1', [('username', 'user1'), ('userclass', 'super-user')]), ('readonly', [('username', 'readonly'), ('userclass', 'read-only')])]
Iterar a través de una tabla
Las tablas admiten la iteración, que permite recorrer cada elemento de configuración de la misma manera que lo haría con una lista o un diccionario. Esto facilita el formateo y la impresión rápidos de los campos deseados.
La siguiente definición de tabla extrae los system/login/user
elementos de los datos de configuración:
UserTable: get: system/login/user view: UserView UserView: fields: username: name userclass: class
La siguiente aplicación Junos PyEZ recorre los user
elementos e imprime el nombre y la clase de cada usuario:
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))
Los username
campos y userclass
, que se definen en UserView, corresponden a los valores de los name
elementos y class
, respectivamente, en los datos de configuración. El resultado incluye el nombre y la clase del usuario.
Username is user1 User class is super-user Username is readonly User class is read-only
Aunque UserView define un username
campo que se asigna al elemento, de forma predeterminada, cada elemento View tiene una name
propiedad que hace referencia a name
la clave que identifica de forma exclusiva ese elemento. Por lo tanto, también podría usar user.name
en este ejemplo para hacer referencia al valor del name
elemento.