Uso de Ansible para configurar dispositivos Junos
Utilice los módulos Ansible de Juniper Networks para administrar la configuración en dispositivos Junos.
Juniper Networks proporciona un módulo de Ansible que le permite configurar dispositivos Junos. En el cuadro 1 se describe el módulo disponible. La cuenta de usuario que se usa para realizar cambios en la configuración debe tener permisos para cambiar las partes relevantes de la configuración en cada dispositivo.
Conjunto de contenido |
Nombre del módulo |
---|---|
|
En las siguientes secciones se explica cómo utilizar el módulo para modificar y confirmar la configuración en dispositivos Junos.
Descripción general del módulo
El juniper.device.config
módulo le permite realizar las siguientes operaciones en dispositivos Junos:
-
Cargar datos de configuración
-
Confirmar la configuración
-
Revertir la configuración
-
Cargar la configuración de rescate
Para modificar la configuración, la lista de argumentos del módulo debe incluir el load
parámetro para cargar nuevos datos de configuración o el rollback
parámetro para revertir a la configuración de rescate o una configuración confirmada anteriormente. El proceso básico para realizar cambios en la configuración consiste en bloquear la configuración, cargar los cambios de configuración, confirmar la configuración para activarla y, a continuación, desbloquear la configuración.
De forma predeterminada, el config
módulo realiza cambios en la base de datos de configuración candidata utilizando configure exclusive
el modo, que bloquea y desbloquea automáticamente la configuración global candidata. También puede especificar un modo de configuración diferente. Por ejemplo, puede realizar cambios en una copia privada de la configuración candidata o en la base de datos de configuración efímera. Para obtener más información acerca de cómo especificar el modo de configuración, consulte Cómo especificar el modo de configuración.
Al cargar nuevos datos de configuración, además de especificar el modo de configuración, también puede especificar la operación de carga y el origen y formato de los cambios.
-
Operación de carga: la operación de carga determina cómo se cargan los datos de configuración en la base de datos de configuración seleccionada. La función admite muchas de las mismas operaciones de carga que están disponibles en la CLI de Junos OS. Para obtener más información, consulte Cómo especificar la acción de carga.
-
Formato: puede configurar dispositivos Junos con uno de los formatos estándar compatibles. Puede proporcionar datos de configuración o plantillas Jinja2 como texto, elementos XML de Junos, comandos de Junos OS
set
o JSON. Para obtener información acerca de cómo especificar el formato de los datos de configuración, consulte Cómo especificar el formato de los datos de configuración que se van a cargar. -
Origen de datos de configuración: puede cargar datos de configuración desde una lista de cadenas, un archivo en el nodo de control local de Ansible, una plantilla Jinja2 o una URL accesible desde el dispositivo cliente incluyendo el
lines
parámetro,src
,template
o , respectivamenteurl
. Para obtener más información acerca de cómo especificar el origen de los datos de configuración, consulte las secciones siguientes:
El config
módulo también le permite cargar y confirmar la configuración de rescate o revertir la configuración a una configuración previamente confirmada. Para cargar la configuración de rescate o una configuración confirmada anteriormente, debe incluir el argumento module rollback
. Para obtener más información, consulte las secciones siguientes:
Después de modificar la configuración, debe confirmar la configuración para convertirla en la configuración activa en el dispositivo. De forma predeterminada, el config
módulo confirma los cambios en la configuración. Para modificar este comportamiento o proporcionar opciones de confirmación adicionales, consulte Cómo confirmar la configuración.
De forma predeterminada, cuando el config
módulo incluye los load
argumentos o rollback
para cambiar la configuración, el módulo devuelve automáticamente los cambios de configuración en formato diff o parche en la respuesta del módulo. Las diferencias se devuelven en las diff
variables y diff_lines
. Para evitar que el módulo calcule y devuelva las diferencias, establezca el argumento del diff
módulo en false
.
Cómo especificar el modo de configuración
Puede especificar el modo de configuración que se utilizará al modificar la configuración del dispositivo. Para especificar el modo de configuración en la tarea, incluya el config
parámetro del config_mode
módulo. Los modos de configuración admitidos incluyen:
-
batch
-
dynamic
-
ephemeral
-
exclusive
-
private
De forma predeterminada, el módulo realiza cambios en la base de datos de configuración candidata utilizando configure exclusive
el juniper.device.config
modo. El modo exclusivo de configuración bloquea la configuración global candidata (también conocida como base de datos de configuración compartida) durante el tiempo que el módulo requiera realizar los cambios solicitados en la configuración. El bloqueo de la base de datos impide que otros usuarios modifiquen o confirmen cambios en la base de datos hasta que se libere el bloqueo.
En los ejemplos siguientes se muestra cómo configurar una copia privada de la configuración candidata y cómo configurar la base de datos efímera.
Ejemplo: config_mode: "privado"
El siguiente manual private
utiliza el modo de configuración para modificar una copia privada de la configuración candidata:
--- - name: "Configure Device" hosts: dc1 connection: local gather_facts: no tasks: - name: "Configure op script" juniper.device.config: config_mode: "private" load: "set" lines: - "set system scripts op file bgp.slax" register: response - name: "Print the config changes" ansible.builtin.debug: var: response.diff_lines
user@ansible-cn:~/ansible$ ansible-playbook configure-script.yaml PLAY [Configure Device] ******************************************************* TASK [Configure op script] **************************************************** changed: [dc1a.example.net] TASK [Print the config changes] *********************************************** ok: [dc1a.example.net] => { "response.diff_lines": [ "", "[edit system scripts op]", "+ file bgp.slax;" ] } PLAY RECAP ******************************************************************** dc1a.example.net : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Configurar la base de datos efímera
Puede utilizar el juniper.device.config
módulo para actualizar la base de datos de configuración efímera en dispositivos compatibles con esta base de datos. La base de datos efímera es una base de datos de configuración alternativa que proporciona una interfaz programática rápida para realizar actualizaciones de configuración en dispositivos Junos.
Para abrir y configurar la instancia predeterminada de la base de datos de configuración efímera, incluya el config_mode: "ephemeral"
argumento. Por ejemplo:
--- - name: "Configure ephemeral database" hosts: dc1a connection: local gather_facts: no tasks: - name: "Configure the default ephemeral database" juniper.device.config: config_mode: "ephemeral" load: "set" lines: - "set protocols mpls label-switched-path to-hastings to 192.0.2.1"
Para abrir y configurar una instancia existente definida por el usuario de la base de datos de configuración efímera, incluya el config_mode: "ephemeral"
argumento y establezca el ephemeral_instance
argumento en el nombre de la instancia.
tasks: - name: "Configure a user-defined ephemeral instance" juniper.device.config: config_mode: "ephemeral" ephemeral_instance: "eph1" load: "set" lines: - "set protocols mpls label-switched-path to-hastings to 192.0.2.2"
Cómo especificar la acción de carga
El juniper.device.config
módulo admite la carga de cambios de configuración mediante muchas de las mismas operaciones de carga admitidas en la CLI de Junos OS. La operación de carga se especifica incluyendo el load
parámetro en la lista de argumentos del módulo y estableciéndolo en el valor de la operación de carga correspondiente. En la tabla 2 se resumen los parámetros necesarios para cada tipo de operación de carga.
Operación de carga |
load Argumento |
Descripción |
---|---|---|
|
|
Combine la configuración cargada con la configuración existente. |
|
|
Reemplace toda la configuración por la configuración cargada. |
|
|
Cargue los datos de configuración desde un archivo de revisión. |
|
|
Combine la configuración cargada con la configuración existente, pero reemplace las instrucciones de la configuración existente por aquellas que especifican la |
|
|
Cargue los datos de configuración que están en |
|
|
Compare la configuración cargada completa con la configuración existente. Cada elemento de configuración que es diferente en la configuración cargada reemplaza su elemento correspondiente en la configuración existente. Durante la operación de confirmación, solo los procesos del sistema que se ven afectados por los elementos de configuración modificados analizan la nueva configuración. |
Cómo especificar el formato de los datos de configuración que se van a cargar
El juniper.device.config
módulo le permite configurar dispositivos Junos mediante uno de los formatos estándar compatibles. Puede proporcionar datos de configuración como cadenas o archivos. Los archivos pueden contener datos de configuración o plantillas Jinja2. Al proporcionar datos de configuración dentro de una cadena, archivo o plantilla Jinja2, los formatos admitidos para los datos incluyen texto, elementos XML de Junos, comandos de Junos OS set
y JSON.
El config
módulo intenta detectar automáticamente el formato de los datos de configuración que proporciona como cadenas dentro del lines
argumento. Sin embargo, puede especificar explícitamente el formato de las cadenas incluyendo el format
argumento. Cuando proporcione datos de configuración en un archivo o plantilla Jinja2, debe especificar el formato de los datos agregando la extensión adecuada al archivo o incluyendo el format
argumento.
En la tabla 3 se resumen los formatos admitidos para los datos de configuración y el valor correspondiente para la extensión de archivo y format
el parámetro. Si incluye el format
argumento, invalida tanto el formato de detección automática de cadenas como el formato indicado por una extensión de archivo.
Formato de datos de configuración |
Extensión de archivo |
parámetro format |
---|---|---|
Instrucciones de configuración de CLI (texto) |
.Conf |
" |
Notación de objetos JavaScript (JSON) |
.json |
" |
Comandos de Junos OS |
.poner |
" |
Elementos XML de Junos |
.XML |
" |
Cuando establece el argumento del load
módulo en 'override'
o 'update'
, no puede utilizar el formato de comando de Junos OS set
.
Cómo cargar datos de configuración como cadenas
El juniper.device.config
módulo le permite cargar datos de configuración desde una lista de cadenas. Para cargar datos de configuración como cadenas, incluya el argumento apropiado load
y el lines
argumento. El lines
argumento toma una lista de cadenas que contienen los datos de configuración para cargar.
El módulo intenta detectar automáticamente el formato de los lines
datos de configuración. Sin embargo, puede especificar explícitamente el formato incluyendo el format
argumento. Para obtener información acerca de cómo especificar el formato, consulte Cómo especificar el formato de los datos de configuración que se van a cargar. Si incluye el format
argumento, invalida el formato detectado automáticamente.
El siguiente manual configura y confirma dos scripts operativos. En este caso, el load
argumento tiene el valor 'set'
, ya que los datos de configuración utilizan lines
el formato de instrucción Junos OS set
.
--- - name: "Load and commit configuration" hosts: dc1 connection: local gather_facts: no tasks: - name: "Load configuration data using strings and commit" juniper.device.config: load: "set" lines: - "set system scripts op file bgp.slax" - "set system scripts op file bgp-neighbor.slax" register: response - name: "Print the response" ansible.builtin.debug: var: response
En el siguiente manual se configuran las mismas instrucciones mediante lines
datos de configuración en formato de texto. En este caso, load: "merge"
se utiliza.
--- - name: "Load and commit configuration" hosts: dc1 connection: local gather_facts: no tasks: - name: "Load configuration data using strings and commit" juniper.device.config: load: "merge" lines: - | system { scripts { op { file bgp.slax; file bgp-neighbor.slax; } } } register: response - name: "Print the response" ansible.builtin.debug: var: response
Cómo cargar datos de configuración desde un archivo local o remoto
El juniper.device.config
módulo le permite cargar datos de configuración desde un archivo. El archivo puede residir en una de las siguientes ubicaciones:
-
Nodo de control de Ansible
-
Dispositivo cliente
-
URL accesible desde el dispositivo cliente
Al cargar datos de configuración desde un archivo, debe indicar la ubicación del archivo y el formato de los datos de configuración en el archivo. Los formatos de datos de configuración admitidos incluyen texto, elementos XML de Junos, comandos de Junos OS set
y JSON. Para obtener información acerca de cómo cargar archivos que contienen plantillas Jinja2, consulte Cómo cargar datos de configuración mediante una plantilla Jinja2.
Puede especificar el formato de los datos de configuración incluyendo explícitamente el format
parámetro en la lista de argumentos del módulo o agregando la extensión adecuada al archivo de datos de configuración. Si especifica el format
parámetro, anula el formato indicado por la extensión de archivo. Para obtener información acerca de cómo especificar el formato, consulte Cómo especificar el formato de los datos de configuración que se van a cargar. Cuando los datos de configuración utilizan el formato XML de Junos, debe encerrar los datos en la etiqueta de nivel <configuration>
superior.
No es necesario incluir datos de configuración con formato de texto ASCII, comandos de Junos OS set
o JSON en <configuration-text>
, ni <configuration-json>
etiquetas, <configuration-set>
según sea necesario, al configurar el dispositivo directamente dentro de una sesión de NETCONF.
En la tabla 4 se describen los parámetros del módulo que puede incluir para especificar la ubicación del archivo.
Parámetro de módulo |
Descripción |
---|---|
|
Ruta absoluta o relativa a un archivo en el nodo de control de Ansible. El directorio predeterminado es el directorio del manual. |
|
Ruta absoluta o relativa a un archivo en el dispositivo cliente, o a una ubicación FTP o una URL HTTP. El directorio predeterminado del dispositivo cliente es el directorio de trabajo actual, que de forma predeterminada es el directorio principal del usuario. |
Para cargar datos de configuración desde un archivo local en el nodo de control de Ansible, establezca el src
argumento en la ruta absoluta o relativa del archivo que contiene los datos de configuración. Por ejemplo:
--- - name: "Load and commit configuration" hosts: dc1 connection: local gather_facts: no tasks: - name: "Load configuration from a local file and commit" juniper.device.config: load: "merge" src: "build_conf/{{ inventory_hostname }}/junos.conf" register: response - name: "Print the response" ansible.builtin.debug: var: response
Para cargar datos de configuración desde un archivo en el dispositivo Junos o desde una URL FTP o HTTP, utilice el url
parámetro y especifique la ruta del archivo que contiene los datos de configuración que se van a cargar. Por ejemplo:
--- - name: "Load and commit configuration" hosts: dc1 connection: local gather_facts: no tasks: - name: "Load configuration from a remote file and commit" juniper.device.config: load: "merge" url: "/var/tmp/junos.conf" register: response - name: "Print the response" ansible.builtin.debug: var: response
El valor de puede url
ser una ruta de archivo local absoluta o relativa, una ubicación FTP o una dirección URL HTTP.
-
La ruta de acceso de un archivo local en el dispositivo de destino tiene una de las siguientes formas:
-
/path/filename: archivo en un sistema de archivos montado, ya sea en el disco flash local o en el disco duro.
-
un:filename o un:path/filename—Archivo en la unidad local. La ruta predeterminada es / (el directorio de nivel raíz). Los medios extraíbles pueden estar en formato MS-DOS o UNIX (UFS).
-
-
La ruta de acceso de archivo para un archivo en un servidor FTP tiene la siguiente forma:
ftp://username:password@hostname/path/filename
-
La ruta de acceso de un archivo en un servidor HTTP tiene el siguiente formato:
http://username:password@hostname/path/filename
En cada caso, el valor predeterminado de la path variable es el directorio principal del usuario. Para especificar una ruta absoluta, la aplicación inicia la ruta con los caracteres %2F; por ejemplo, ftp://username:password@hostname/%2Fpath/filename.
Cómo cargar datos de configuración usando una plantilla Jinja2
El juniper.device.config
módulo le permite representar datos de configuración desde un archivo de plantilla Jinja2 en el nodo de control de Ansible y cargar y confirmar la configuración en un dispositivo Junos. Jinja es un motor de plantillas para Python que le permite generar documentos a partir de plantillas predefinidas. Las plantillas, que son archivos de texto en el idioma deseado, proporcionan flexibilidad mediante el uso de expresiones y variables. Puede crear datos de configuración de Junos OS con plantillas Jinja2 en uno de los formatos de configuración compatibles, que incluye texto ASCII, elementos XML de Junos, comandos de Junos OS set
y JSON. El módulo de Ansible utiliza la plantilla Jinja2 y un diccionario de variables suministrado para representar los datos de configuración.
Para cargar y confirmar datos de configuración mediante una plantilla Jinja2, incluya los template
parámetros y vars
en la lista de argumentos del módulo.
-
template
—Ruta del archivo de plantilla Jinja2 -
vars
—Diccionario de claves y valores necesarios para representar la plantilla Jinja2
También debe incluir el format
parámetro cuando la extensión de archivo de la plantilla no indique el formato de los datos. Para obtener información acerca de cómo especificar el formato, consulte Cómo especificar el formato de los datos de configuración que se van a cargar.
Por ejemplo, el archivo interfaces-mpls.j2 contiene la siguiente plantilla Jinja2:
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 %} } }
Para usar el juniper.device.config
módulo para cargar la plantilla Jinja2, establezca el template
argumento en la ruta del archivo de plantilla y defina las variables requeridas por la plantilla en el vars
diccionario. El siguiente manual utiliza la plantilla Jinja2 y las variables definidas en vars
para representar los datos de configuración y cargarlos y confirmarlos en el host de destino. El format
parámetro indica el formato de los datos de configuración en el archivo de plantilla.
--- - name: "Load and commit configuration" hosts: dc1 connection: local gather_facts: no tasks: - name: "Load a configuration from a Jinja2 template and commit" juniper.device.config: load: "merge" template: "build_conf/templates/interfaces-mpls.j2" format: "text" vars: interfaces: ["ge-1/0/1", "ge-1/0/2", "ge-1/0/3"] description: "MPLS interface" family: "mpls" register: response - name: "Print the response" ansible.builtin.debug: var: response
El módulo genera los siguientes datos de configuración, que se cargan en la configuración candidata en el dispositivo y se confirman:
interfaces { ge-1/0/1 { description "MPLS interface"; unit 0 { family mpls; } } ge-1/0/2 { description "MPLS interface"; unit 0 { family mpls; } } ge-1/0/3 { description "MPLS interface"; unit 0 { family mpls; } } } protocols { mpls { interface ge-1/0/1; interface ge-1/0/2; interface ge-1/0/3; } rsvp { interface ge-1/0/1; interface ge-1/0/2; interface ge-1/0/3; } }
Cómo cargar la configuración de rescate
Una configuración de rescate le permite definir una configuración de trabajo conocida o una configuración con un estado conocido que puede restaurar en cualquier momento. Utilice la configuración de rescate cuando necesite volver a una configuración conocida o como último recurso si la configuración del dispositivo y los archivos de configuración de copia de seguridad se dañan sin posibilidad de reparación. Cuando se crea una configuración de rescate, el dispositivo guarda la configuración confirmada más reciente como configuración de rescate.
El juniper.device.config
módulo le permite revertir a una configuración de rescate existente en dispositivos Junos. Para cargar y confirmar la configuración de rescate en un dispositivo, incluya el argumento del rollback: "rescue"
módulo. Por ejemplo:
--- - name: "Revert to rescue configuration" hosts: dc1a connection: local gather_facts: no tasks: - name: "Load and commit rescue configuration" juniper.device.config: rollback: "rescue" register: response - name: "Print response" ansible.builtin.debug: var: response
Cómo revertir la configuración
Los dispositivos Junos almacenan una copia de la configuración confirmada más reciente y hasta 49 configuraciones anteriores, dependiendo de la plataforma. 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.
El juniper.device.config
módulo le permite revertir a una configuración previamente confirmada en dispositivos Junos. Para revertir la configuración y confirmarla, incluya el argumento del rollback
módulo y especifique el ID de la configuración de reversión. Los valores de ID válidos son 0 (cero, para la configuración confirmada más recientemente) a través de uno menos que el número de configuraciones anteriores almacenadas (el máximo es 49).
En el siguiente manual se solicita el identificador de reversión de la configuración que se va a restaurar, se revierte la configuración y se confirma, y, a continuación, se imprimen los cambios de configuración en el resultado estándar:
--- - name: "Roll back the configuration" hosts: dc1a connection: local gather_facts: no vars_prompt: - name: "ROLLBACK" prompt: "Rollback ID of the configuration to restore" private: no tasks: - name: "Roll back the configuration and commit" juniper.device.config: rollback: "{{ ROLLBACK }}" register: response - name: "Print the configuration changes" ansible.builtin.debug: var: response.diff_lines
user@ansible-cn:~/ansible$ ansible-playbook configuration-rollback.yaml Rollback ID of the configuration to restore: 1 PLAY [Roll back the configuration] ******************************************** TASK [Roll back the configuration and commit] ********************************* changed: [dc1a.example.net] TASK [Print the configuration changes] *************************************** ok: [dc1a.example.net] => { "response.diff_lines": [ "", "[edit interfaces]", "- ge-0/0/0 {", "- unit 0 {", "- family mpls;", "- }", "- }" ] } PLAY RECAP ******************************************************************** dc1a.example.net : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Cómo confirmar la configuración
De forma predeterminada, cuando se utiliza el juniper.device.config
módulo para modificar la configuración mediante el load
argumento o rollback
, el módulo realiza automáticamente una comprobación de confirmación y confirma los cambios. Para evitar que el módulo realice una comprobación de confirmación o confirme los cambios, establezca el check
argumento o commit
en false
, respectivamente.
También puede personalizar la operación de confirmación con muchas de las mismas opciones que están disponibles en la CLI de Junos OS. En la tabla 5 se describen los argumentos de módulo que se pueden utilizar para especificar diferentes opciones de confirmación.
Argumento del módulo |
Descripción |
Valor predeterminado para |
---|---|---|
|
Realice una comprobación de confirmación o confirme una operación de confirmación confirmada anterior. |
|
|
Espere el número de segundos especificado entre la comprobación de confirmación y la operación de confirmación. |
– |
|
Registre un comentario para esa operación de confirmación en el archivo de registro del sistema y en el historial de confirmaciones del dispositivo. |
– |
|
Confirme los cambios de configuración o confirme una operación de confirmación confirmada anterior. |
|
|
Confirme los cambios de configuración incluso si no hay diferencias entre la configuración candidata y la configuración confirmada. |
|
|
Sincronice y confirme la configuración en todos los motores de enrutamiento, incluso si hay sesiones de configuración abiertas o cambios de configuración no confirmados en el otro motor de enrutamiento. |
|
|
Sincronice y confirme la configuración en todos los motores de enrutamiento. |
|
|
Requerir que una operación de confirmación se confirme dentro de un período de tiempo especificado después de la confirmación inicial. Si la confirmación no se confirma en el tiempo especificado, vuelva a la configuración confirmada anteriormente. Se debe utilizar la |
– |
|
Espere a que finalice la operación utilizando el valor especificado como tiempo de espera. |
30 segundos |
Confirmar comentario
Cuando confirme la configuración, puede incluir un breve comentario para describir el propósito de los cambios confirmados. Para registrar un comentario que describa los cambios, incluya el comment: "comment string"
argumento con la cadena de mensaje.
Confirmar comprobación
De forma predeterminada, el config
módulo ejecuta tanto una comprobación de confirmación como una operación de confirmación. El check_commit_wait
argumento define el número de segundos que se deben esperar entre las operaciones de comprobación de confirmación y confirmación. Incluya este argumento cuando necesite proporcionar tiempo suficiente para que el dispositivo complete la operación de comprobación de confirmación y suelte el bloqueo de configuración antes de iniciar la operación de confirmación. Si omite el check_commit_wait
argumento, puede haber ciertas circunstancias en las que un dispositivo inicie la operación de confirmación antes de que la operación de comprobación de confirmación libere su bloqueo en la configuración, lo que da como resultado una operación de CommitError
confirmación fallida.
Confirmar cambios vacíos
De forma predeterminada, si no hay diferencias entre la configuración candidata y la configuración confirmada, el módulo no confirma los cambios. Para forzar una operación de confirmación incluso cuando no haya diferencias, incluya el commit_empty_changes: true
argumento.
Confirmar Sincronizar
Si el dispositivo tiene motores de enrutamiento duales, puede sincronizar y confirmar la configuración en ambos motores de enrutamiento incluyendo el commit_sync: true
argumento. Para forzar que la commit synchronize
operación se realice correctamente incluso si hay sesiones de configuración abiertas o cambios de configuración no confirmados en el otro motor de enrutamiento, utilice el commit_force_sync: true
argumento. Cuando se incluye la commit_force_sync: true
opción, el dispositivo finaliza cualquier sesión de configuración en el otro motor de enrutamiento antes de sincronizar y confirmar la configuración.
Confirmar Confirmar
Para requerir que una operación de confirmación se confirme dentro de un período de tiempo especificado después de la confirmación inicial, incluya el confirmed: minutes
argumento. Si la confirmación no se confirma dentro del límite de tiempo especificado, la configuración se revierte automáticamente a la configuración confirmada anteriormente. El rango permitido es de 1 a 65,535 minutos. La operación de confirmación confirmada es útil para comprobar que un cambio de configuración funciona correctamente y no impide el acceso de administración al dispositivo. Si el cambio impide el acceso o causa otros errores, la reversión automática a la configuración anterior permite el acceso al dispositivo después de que expire la fecha límite de reversión. Para confirmar la operación de confirmación, invoque el config
módulo con el check: true
argumento o commit: true
.
En el siguiente manual, la primera tarea modifica la configuración, espera 10 segundos entre la comprobación de confirmación y la operación de confirmación, y requiere que la operación de confirmación se confirme en 5 minutos. También registra un comentario para la confirmación. La segunda tarea emite una commit check
operación para confirmar la confirmación. En un escenario real, puede realizar tareas de validación después de la confirmación inicial y solo ejecutar la confirmación de confirmación si las tareas superan determinados criterios de validación.
--- - name: "Load configuration and confirm within 5 minutes" hosts: dc1 connection: local gather_facts: no tasks: - name: "Load configuration. Wait 10 seconds between check and commit. Confirm within 5 min." juniper.device.config: load: "merge" format: "text" src: "build_conf/{{ inventory_hostname }}/junos.conf" check_commit_wait: 10 confirmed: 5 comment: "updated using Ansible" register: response - name: "Print the response" ansible.builtin.debug: var: response - name: "Confirm the commit with a commit check" juniper.device.config: check: true diff: false commit: false register: response - name: "Print the response" ansible.builtin.debug: var: response
Cómo ignorar las advertencias al configurar dispositivos
El juniper.device.config
módulo le permite modificar y confirmar la configuración en dispositivos Junos. En algunos casos, la respuesta RPC puede contener <rpc-error>
elementos con un nivel de gravedad de advertencia o superior que hacen que el módulo genere una RpcError
excepción. Una RpcError
excepción puede provocar un error en la operación de carga o confirmación.
En algunos casos, puede ser necesario o deseable suprimir las RpcError
excepciones que se generan en respuesta a las advertencias de operaciones de carga y confirmación. Puede indicar config
al módulo que suprima RpcError
las excepciones generadas para las advertencias incluyendo el ignore_warning
parámetro en la lista de argumentos del módulo. El ignore_warning
argumento toma un booleano, una cadena o una lista de cadenas.
Para indicar al módulo que ignore todas las advertencias para las operaciones de carga y confirmación realizadas por el módulo, incluya el ignore_warning: true
argumento. En el ejemplo siguiente se omiten todas las advertencias para las operaciones de carga y confirmación.
--- - name: Configure Device hosts: dc1 connection: local gather_facts: no tasks: - name: Configure op script juniper.device.config: config_mode: "private" load: "set" lines: - "set system scripts op file bgp.slax" ignore_warning: true register: response - name: Print the response ansible.builtin.debug: var: response
Si incluye ignore_warning: true
y todos los <rpc-error>
elementos tienen un nivel de gravedad de advertencia, la aplicación omite todas las advertencias y no genera una RpcError
excepción. Sin embargo, cualquier <rpc-error>
elemento con niveles de gravedad más altos seguirá generando excepciones.
Para indicar al módulo que ignore advertencias específicas, establezca el ignore_warning
argumento en una cadena o en una lista de cadenas que contengan las advertencias que desea omitir. En el ejemplo siguiente se omiten dos advertencias específicas:
--- - name: Configure Device hosts: dc1 connection: local gather_facts: no tasks: - name: Configure Junos device and ignore warnings juniper.device.config: config_mode: "private" load: "merge" src: "build_conf/{{ inventory_hostname }}/junos.conf" ignore_warning: - "Advertisement-interval is less than four times" - "Chassis configuration for network services has been changed." register: response - name: Print the response ansible.builtin.debug: var: response
El módulo suprime las RpcError
excepciones si todos los <rpc-error>
elementos tienen un nivel de gravedad de advertencia y cada advertencia en la respuesta coincide con una o más de las cadenas especificadas.
Ejemplo: Usar Ansible para configurar dispositivos Junos
El juniper.device.config
módulo le permite administrar la configuración en dispositivos Junos. En este ejemplo se utiliza el módulo para realizar cambios de configuración en un dispositivo Junos a través de config
NETCONF a través de SSH.
- Requisitos
- Visión general
- Configuración
- Ejecute el libro de estrategias
- Verificación
- Solucionar errores de Playbook
Requisitos
En este ejemplo se utilizan los siguientes componentes de hardware y software:
-
Servidor de administración de configuración que ejecuta Ansible 2.17 o posterior con la
juniper.device
colección instalada -
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 controlador de Ansible y el dispositivo Junos
-
Archivo de inventario de Ansible existente con los hosts necesarios definidos
Visión general
En este ejemplo se presenta un manual de Ansible que utiliza el juniper.device.config
módulo para habilitar un nuevo script de operación en la configuración de los dispositivos Junos de destino. El archivo de datos de configuración, junos-config.conf, contiene los datos de configuración relevantes con formato de texto.
El manual incluye la Check NETCONF connectivity
tarea, que utiliza el ansible.builtin.wait_for
módulo de Ansible para intentar establecer una sesión de NETCONF con el dispositivo de destino mediante el puerto predeterminado de NETCONF (830). Si el nodo de control no puede establecer una sesión NETCONF con un dispositivo de destino durante la ejecución del manual, omite las tareas restantes en la reproducción para ese dispositivo.
El manual utiliza el juniper.device.file_copy
módulo para copiar el nuevo script de operación desde el nodo de control de Ansible al dispositivo Junos. Los argumentos del módulo especifican el directorio y el nombre de archivo del script en el dispositivo local y el directorio de destino en el dispositivo remoto.
La tarea para configurar el dispositivo ejecuta el juniper.device.config
módulo siempre que la comprobación de NETCONF se haya realizado correctamente. El load: "merge"
argumento carga los nuevos datos de configuración en la configuración candidata mediante una load merge
operación. De forma predeterminada, el config
módulo compromete los datos de configuración en un dispositivo para load
y rollback
operaciones. Los argumentos del módulo incluyen el comment
argumento, que registra un comentario de confirmación en el archivo de registro del sistema y el historial de confirmaciones del dispositivo.
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 el módulo:
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.
Incluya los cambios de configuración deseados en el archivo.
user@ansible-cn:~/ansible$ cat build_conf/dc1a.example.net/junos-config.conf system { scripts { op { file bgp.slax; } } }
Crear el manual de estrategias de Ansible
Procedimiento paso a paso
Para crear un manual que utilice el módulo para realizar cambios de config
configuración en un dispositivo Junos:
Incluya la plantilla del libro de estrategias, que ejecuta los módulos localmente.
--- - name: Load and commit configuration data on a Junos device hosts: dc1 connection: local gather_facts: no
(Opcional) Cree una tarea para comprobar la conectividad de NETCONF.
tasks: - name: Check NETCONF connectivity ansible.builtin.wait_for: host: "{{ inventory_hostname }}" port: 830 timeout: 5
Cree una tarea para copiar el nuevo script operativo en el dispositivo.
- name: Copy the op script to the device juniper.device.file_copy: action: put file: bgp.slax local_dir: scripts remote_dir: /var/db/scripts/op
Cree la tarea para cargar la configuración en el dispositivo y confirme.
- name: Merge configuration data from a file and commit juniper.device.config: load: "merge" src: "build_conf/{{ inventory_hostname }}/junos-config.conf" comment: "Configuring op script with Ansible" register: response
(Opcional) Cree una tarea para imprimir la respuesta, que incluye los cambios de configuración en formato diff .
- name: Print the response ansible.builtin.debug: var: response
Resultados
En el nodo de control Ansible, revise el manual completado. Si el manual no muestra el código deseado, repita las instrucciones de este ejemplo para corregir el manual.
--- - name: Load and commit configuration data on a Junos device hosts: dc1 connection: local gather_facts: no tasks: - name: Check NETCONF connectivity ansible.builtin.wait_for: host: "{{ inventory_hostname }}" port: 830 timeout: 5 - name: Copy the op script to the device juniper.device.file_copy: action: put file: bgp.slax local_dir: scripts remote_dir: /var/db/scripts/op - name: Merge configuration data from a file and commit juniper.device.config: load: "merge" src: "build_conf/{{ inventory_hostname }}/junos-config.conf" comment: "Configuring op script with Ansible" register: response - name: Print the response ansible.builtin.debug: var: response
Ejecute el libro de estrategias
Para ejecutar el manual:
-
Ejecute el
ansible-playbook
comando en el nodo de control y proporcione la ruta del manual y las opciones deseadas.user@ansible-cn:~/ansible$ ansible-playbook ansible-pb-junos-config.yaml PLAY [Load and commit configuration data on a Junos device] *************** TASK [Check NETCONF connectivity] ***************************************** ok: [dc1a.example.net] TASK [Copy the op script to the device] *********************************** changed: [dc1a.example.net] TASK [Merge configuration data from a file and commit] ******************** changed: [dc1a.example.net] TASK [Print the response] ************************************************* ok: [dc1a.example.net] => { "response": { "changed": true, "diff": { "prepared": "\n[edit system scripts op]\n+ file bgp.slax;\n" }, "diff_lines": [ "", "[edit system scripts op]", "+ file bgp.slax;" ], "failed": false, "file": "build_conf/dc1a.example.net/junos-config.conf", "msg": "Configuration has been: opened, loaded, checked, diffed, committed, closed." } } PLAY RECAP **************************************************************** dc1a.example.net : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Verificación
Verificar la configuración
Propósito
Compruebe que la configuración se actualizó correctamente en el dispositivo Junos.
Acción
Revise la salida del manual de estrategias de Ansible para ver si la tarea de configuración se realizó correctamente o no. También puede iniciar sesión en el dispositivo Junos y ver 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.slax; }
user@dc1a> show system commit 0 2020-12-17 15:33:50 PST by user via netconf Configuring op script with Ansible
user@dc1a> show log messages Dec 17 15:33:39 dc1a mgd[33444]: UI_COMMIT: User 'user' requested 'commit' operation (comment: Configuring op script with Ansible) Dec 17 15:33:57 dc1a mgd[33444]: UI_COMMIT_COMPLETED: commit complete
Solucionar errores de Playbook
- 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 manual genera un mensaje de TimeoutExpiredError
error y no actualiza la configuración del dispositivo.
ncclient.operations.errors.TimeoutExpiredError: ncclient timed out while waiting for an rpc reply
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 RPC predeterminado, establezca el argumento del timeout
módulo en un valor adecuado y vuelva a ejecutar el manual.
Solucionar errores de bloqueo de configuración
Problema
El manual genera un mensaje de LockError
error que indica que no se puede bloquear la configuración. Por ejemplo:
FAILED! => {"changed": false, "msg": "Unable to open the configuration in exclusive mode: LockError(severity: error, bad_element: None, message: configuration database modified)"}
o
FAILED! => {"changed": false, "msg": "Unable to open the configuration in exclusive mode: LockError(severity: error, bad_element: lock-configuration, message: permission denied)"}
Puede producirse un error de bloqueo de configuración por los siguientes motivos:
-
Otro usuario tiene un bloqueo exclusivo en la configuración.
-
Otro usuario realizó cambios en la base de datos de configuración, pero aún no los ha confirmado.
-
El usuario que ejecuta el módulo de Ansible no tiene permisos para configurar el dispositivo.
Solución
La LockError
cadena de mensaje suele indicar la causa raíz del problema. Si otro usuario tiene un bloqueo exclusivo en la configuración o la ha modificado, espere hasta que se libere el bloqueo o se confirmen los cambios, y vuelva a ejecutar el manual. Si la causa del problema es que el usuario no tiene permisos para configurar el dispositivo, ejecute el manual 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 manual genera un mensaje de ConfigLoadError
error que indica que no se puede modificar la configuración porque se ha denegado el permiso.
FAILED! => {"changed": false, "msg": "Failure loading the configuraton: ConfigLoadError(severity: error, bad_element: scripts, message: error: permission denied)"}
Este mensaje de error se genera cuando el usuario que ejecuta el módulo de Ansible tiene permiso para modificar la configuración, pero no tiene permiso para modificar la sección solicitada de la configuración.
Solución
Ejecute el manual 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.