Ejemplo: uso de Junos PyEZ para revertir la configuración
La biblioteca Junos PyEZ le permite realizar tareas operativas y de configuración en dispositivos Junos. En este ejemplo, se utiliza la utilidad Junos PyEZ jnpr.junos.utils.config.Config
para revertir la configuración en un dispositivo Junos.
Requisitos
En este ejemplo se utilizan los siguientes componentes de hardware y software:
Servidor de administración de configuración que ejecuta Python 3.5 o posterior y Junos PyEZ versión 2.0 o posterior
Dispositivo Junos con NETCONF habilitado y una cuenta de usuario configurada con los permisos adecuados
Par de claves pública y privada SSH configurado para el usuario adecuado en el servidor y el dispositivo Junos
Visión general
En este ejemplo se presenta una aplicación Python que utiliza la utilidad Junos PyEZ Config
para revertir la configuración en el dispositivo especificado. Los dispositivos Junos almacenan una copia de la configuración confirmada más reciente y hasta 49 configuraciones anteriores. Puede revertir a cualquiera de las configuraciones almacenadas. Esto resulta útil cuando los cambios en la configuración provocan resultados no deseados y desea volver a una configuración de trabajo conocida. La reversión de la configuración es similar al proceso para realizar cambios de configuración en el dispositivo, pero en lugar de cargar los datos de configuración, se realiza una reversión, que reemplaza toda la configuración candidata por una configuración confirmada anteriormente.
La aplicación Python importa la Device
clase, que controla la conexión con el dispositivo Junos; la Config
clase, que se utiliza para realizar comandos de modo de configuración en el dispositivo de destino; y las excepciones necesarias del jnpr.junos.exception
módulo, que contiene las excepciones encontradas al administrar dispositivos Junos.
Después de crear la Device
instancia para el dispositivo de destino, el open()
método establece una conexión y una sesión NETCONF con el dispositivo. A continuación, los métodos de Config
utilidad bloquean, revierten, confirman y desbloquean la configuración candidata.
El rollback()
método tiene un único parámetro, rb_id
, que es el ID de reversión que especifica la configuración almacenada que se va a cargar. Los valores válidos son 0 (cero, para la configuración confirmada más recientemente) a través de uno menor que el número de configuraciones anteriores almacenadas (el máximo es 49). Si omite este parámetro en la llamada al método, el valor predeterminado es 0. En este ejemplo se carga la configuración con el ID de reversión 1, que es la configuración confirmada justo antes de la configuración activa. El rollback()
método carga la configuración en la configuración candidata, que luego se confirma para activarla llamando al commit()
método.
Después de revertir y confirmar la configuración, la aplicación llama close()
al método para terminar la sesión y la conexión de NETCONF. La aplicación incluye código para controlar excepciones, como LockError
los errores que se producen al bloquear la configuración y CommitError
los errores que se producen durante la operación de confirmación. La aplicación también incluye código para controlar cualquier excepción adicional que pueda producirse.
Configuración
Crear la aplicación Junos PyEZ
Procedimiento paso a paso
Para crear una aplicación Python que utilice Junos PyEZ para revertir la configuración en un dispositivo Junos:
Importe los módulos, clases y objetos necesarios.
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 RpcError from jnpr.junos.exception import CommitError from jnpr.junos.exception import UnlockError
Incluya las variables necesarias, que en este ejemplo incluyen el nombre de host del dispositivo administrado.
host = 'dc1a.example.com'
Cree una definición de función y una llamada a
main()
una función, y coloque las instrucciones restantes dentro de la definición.def main(): if __name__ == "__main__": main()
Cree una instancia de la
Device
clase y proporcione el nombre de host y los parámetros necesarios para esa conexión específica.dev = Device(host=host)
Abra una conexión y establezca una sesión de NETCONF con el dispositivo.
# open a connection with the device and start a NETCONF session try: dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) return
Cree una instancia de la
Config
utilidad.# Set up config object cu = Config(dev)
Bloquee la configuración.
# Lock the configuration print ("Locking the configuration") try: cu.lock() except LockError as err: print ("Unable to lock configuration: {0}".format(err)) dev.close() return
Desvierta y confirme la configuración, y controle cualquier error.
# Roll back and commit configuration try: print ("Rolling back the configuration") cu.rollback(rb_id=1) print ("Committing the configuration") cu.commit() except CommitError as err: print ("Error: Unable to commit configuration: {0}".format(err)) except RpcError as err: print ("Unable to roll back configuration changes: {0}".format(err))
Desbloquee la configuración y, a continuación, finalice la sesión de NETCONF y cierre la conexión con el dispositivo.
finally: print ("Unlocking the configuration") try: cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return
Resultados
En el servidor de administración de configuración, revise la aplicación completada. Si la aplicación no muestra el código deseado, repita las instrucciones de este ejemplo para corregir la aplicación.
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 RpcError from jnpr.junos.exception import CommitError from jnpr.junos.exception import UnlockError host = 'dc1a.example.com' def main(): dev = Device(host=host) # open a connection with the device and start a NETCONF session try: dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) return # Set up config object cu = Config(dev) # Lock the configuration print ("Locking the configuration") try: cu.lock() except LockError as err: print ("Unable to lock configuration: {0}".format(err)) dev.close() return # Roll back and commit configuration try: print ("Rolling back the configuration") cu.rollback(rb_id=1) print ("Committing the configuration") cu.commit() except CommitError as err: print ("Error: Unable to commit configuration: {0}".format(err)) except RpcError as err: print ("Unable to roll back configuration changes: {0}".format(err)) finally: print ("Unlocking the configuration") try: cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return if __name__ == "__main__": main()
Ejecutar el código PyEZ de Junos
Ejecutar la aplicación
Para ejecutar el código de Junos PyEZ:
-
En el servidor de administración de configuración, ejecute la aplicación.
user@server:~$ python3 junos-pyez-config-rollback.py Locking the configuration Rolling back the configuration Committing the configuration Unlocking the configuration
Verificación
Verificar la configuración
Propósito
Compruebe que la configuración se haya revertido correctamente en el dispositivo Junos.
Acción
Inicie sesión en el dispositivo Junos y vea la configuración o las diferencias de configuración y el archivo de registro. Por ejemplo:
user@dc1a> show configuration | compare rollback 1 [edit system scripts op] - file bgp-neighbors.slax; [edit interfaces] - ge-1/0/0 { - unit 0 { - family inet { - address 198.51.100.1/26; - } - } - } + ge-1/1/0 { + unit 0 { + family inet { + address 198.51.100.65/26; + } + } + }
user@dc1a> show log messages Sep 19 12:42:06 dc1a sshd[5838]: Accepted publickey for user from 198.51.100.1 port 58663 ssh2: RSA 02:dd:53:3e:f9:97:dd:1f:d9:31:e9:7f:82:06:aa:67 Sep 19 12:42:10 dc1a file[5841]: UI_LOAD_EVENT: User 'user' is performing a 'rollback 1' Sep 19 12:42:11 dc1a file[5841]: UI_COMMIT: User 'user' requested 'commit' operation (comment: none) Sep 19 12:42:26 dc1a file[5841]: UI_COMMIT_COMPLETED: commit complete
Significado
Las diferencias de configuración y el contenido del archivo de registro indican que la configuración se revirtió correctamente y se confirmó en el dispositivo.