Ejemplo: uso de Junos PyEZ para cargar datos de configuración desde un archivo
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 cargar datos de configuración desde un archivo local del servidor de administración de 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 habilitar un nuevo script op en la configuración del dispositivo especificado. El archivo junos-config-add-op-script.conf, que se encuentra en el servidor de administración de configuración, contiene los datos de configuración relevantes con formato de texto ASCII.
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 cambios de configuración no estructurados en el dispositivo de destino; y las excepciones necesarias desde el jnpr.junos.exception
módulo, que contiene las excepciones encontradas al administrar dispositivos Junos. En este ejemplo se enlaza la Config
instancia a la Device
instancia en lugar de crear una variable independiente para la instancia de la Config
clase.
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 Config
continuación, los métodos de utilidad bloquean la configuración candidata, cargan los cambios de configuración en la configuración candidata como una load merge
operación, confirman la configuración candidata y, a continuación, la desbloquean.
El load()
parámetro method path
se establece en la ruta de acceso del archivo de configuración. Dado que la extensión del archivo de configuración indica el formato de los datos de configuración, el format
parámetro se omite en la lista de argumentos. La configuración merge=True
indica que el dispositivo debe realizar una load merge
operación.
Una vez completadas las operaciones de 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 el archivo de datos de configuración
Procedimiento paso a paso
Para crear el archivo de datos de configuración utilizado por la aplicación Junos PyEZ:
Cree un nuevo archivo con la extensión adecuada según el formato de los datos de configuración, que en este ejemplo es texto ASCII.
Incluya los cambios de configuración deseados en el archivo, por ejemplo:
system { scripts { op { file bgp-neighbors.slax; } } }
Crear la aplicación Junos PyEZ
Procedimiento paso a paso
Para crear una aplicación Python que utilice Junos PyEZ para realizar cambios de 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 UnlockError from jnpr.junos.exception import ConfigLoadError from jnpr.junos.exception import CommitError
Incluya las variables necesarias, que en este ejemplo incluyen el nombre de host del dispositivo administrado y la ruta al archivo que contiene los datos de configuración.
host = 'dc1a.example.com' conf_file = 'configs/junos-config-add-op-script.conf'
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.A continuación, 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 = Device(host=host) dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) return
Enlazar la
Config
instancia a laDevice
instancia.dev.bind(cu=Config)
Bloquee la configuración.
# 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
Cargue los cambios de configuración y controle los errores.
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
Confirme la configuración.
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
Desbloquee la configuración.
print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err))
Finalice la sesión de NETCONF y cierre la conexión con el dispositivo.
# End the NETCONF session and close the connection dev.close()
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 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()
Ejecute la aplicación Junos PyEZ
Ejecutar la aplicación
-
En el servidor de administración de configuración, ejecute la aplicación.
user@server:~$ python3 junos-pyez-config.py Locking the configuration Loading configuration changes Committing the configuration Unlocking the configuration
Verificación
Verificar la configuración
Propósito
Compruebe que la configuración se actualizó correctamente en el dispositivo Junos.
Acción
Inicie sesión en el dispositivo Junos y vea la configuración, el historial de confirmaciones y los archivos de registro para verificar la configuración y la confirmación. Por ejemplo:
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
Significado
La configuración y el contenido del archivo de registro indican que las instrucciones de configuración correctas se configuraron y confirmaron correctamente en el dispositivo.
Solución de problemas
- Solucionar errores de tiempo de espera
- Solucionar errores de bloqueo de configuración
- Solucionar errores de cambio de configuración
Solucionar errores de tiempo de espera
Problema
El código de Junos PyEZ genera un mensaje RpcTimeoutError o un mensaje TimeoutExpiredError y no actualiza la configuración del dispositivo.
RpcTimeoutError(host: dc1a.example.com, cmd: commit-configuration, timeout: 30)
El tiempo predeterminado para que se agote el tiempo de espera de una RPC de NETCONF es de 30 segundos. Los cambios de configuración grandes pueden superar este valor, lo que hace que se agote el tiempo de espera de la operación antes de que se pueda cargar y confirmar la configuración.
Solución
Para adaptarse a los cambios de configuración que pueden requerir un tiempo de confirmación superior al intervalo de tiempo de espera predeterminado, establezca el intervalo de tiempo de espera en un valor adecuado y vuelva a ejecutar el código. Para configurar el intervalo, establezca la Device
timeout
propiedad en un valor adecuado o incluya el timeout=seconds
argumento cuando llame commit()
al método para confirmar los datos de configuración en un dispositivo. Por ejemplo:
dev = Device(host="host") dev.open() dev.timeout = 300 ... dev.cu.commit(timeout=360)
Solucionar errores de bloqueo de configuración
Problema
El código PyEZ de Junos genera un mensaje LockError que indica que no se puede bloquear la configuración. Por ejemplo:
LockError(severity: error, bad_element: None, message: configuration database modified)
Puede producirse un error de bloqueo de configuración por los siguientes motivos:
Otro usuario tiene un bloqueo exclusivo en la configuración.
La base de datos de configuración compartida tiene cambios no confirmados.
El usuario que ejecuta el código de Junos PyEZ no tiene permisos para configurar el dispositivo.
Solución
Si otro usuario tiene un bloqueo exclusivo en la configuración o ha modificado la configuración, espere hasta que se libere el bloqueo o se confirmen los cambios, y vuelva a ejecutar el código. Si la causa del problema es que el usuario no tiene permisos para configurar el dispositivo, ejecute la aplicación con un usuario que tenga los permisos necesarios o, si corresponde, configure el dispositivo Junos para otorgar al usuario actual los permisos necesarios para realizar los cambios.
Solucionar errores de cambio de configuración
Problema
El código de Junos PyEZ genera un mensaje ConfigLoadError que indica que la configuración no se puede modificar debido a un problema de permisos.
ConfigLoadError(severity: error, bad_element: scripts, message: permission denied)
Este mensaje de error puede generarse cuando el usuario que ejecuta el código de Junos PyEZ tiene permiso para modificar la configuración, pero no tiene permiso para modificar la parte deseada de la configuración.
Solución
Ejecute la aplicación con un usuario que tenga los permisos necesarios o, si corresponde, configure el dispositivo Junos para otorgar al usuario actual los permisos necesarios para realizar los cambios.