Utilice el juniper.device.config módulo Ansible para administrar la configuración de Junos OS
Puede utilizar el juniper.device.config módulo de Ansible para administrar la configuración en dispositivos que ejecutan Junos OS y dispositivos que ejecutan Junos OS Evolved.
Juniper Networks proporciona módulos de Ansible que le permiten configurar dispositivos Junos. En la Tabla 1 se describen los módulos disponibles. Si ya está utilizando un conjunto determinado de módulos de la juniper.device colección, use el módulo para ese conjunto.
|
Colección |
Conjunto de módulos |
Nombre del módulo |
|---|---|---|
|
|
||
|
|
juniper.device.junos_config |
En las siguientes secciones se describe cómo usar el juniper.device.config módulo para modificar y confirmar la configuración en dispositivos Junos. Para obtener más información acerca del juniper.device.junos_config módulo, consulte Uso del módulo de Ansible de juniper.device.junos_config para configurar 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
-
Cargue la configuración de rescate
El proceso básico para realizar cambios de configuración consiste en bloquear la configuración, cargar los cambios de configuración, confirmar la configuración para activarla y, luego, desbloquear la configuración. La cuenta de usuario que se usa para realizar cambios de configuración debe tener permisos para cambiar las partes relevantes de la configuración en cada dispositivo. Para modificar la configuración, la lista de argumentos del módulo debe incluir uno de los siguientes parámetros:
-
load: cargue nuevos datos de configuración. -
rollback: revertir a la configuración de rescate o a una configuración previamente confirmada.
De forma predeterminada, el juniper.device.config módulo realiza cambios en la base de datos de configuración candidata mediante 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 sobre 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. Puede seleccionar entre 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 los dispositivos Junos mediante 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
seto 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. -
Fuente de datos de configuración: puede cargar datos de configuración desde una lista de cadenas, un archivo en el nodo de control de Ansible local, una plantilla Jinja2 o una URL a la que se pueda acceder desde el dispositivo cliente. Para obtener más información sobre cómo especificar el origen de los datos de configuración, consulte las secciones siguientes:
El juniper.device.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 previamente confirmada, 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 que sea la configuración activa en el dispositivo. De forma predeterminada, el juniper.device.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 juniper.device.config módulo incluye los load argumentos o rollback , la respuesta del módulo devuelve automáticamente los cambios de configuración en formato diff o patch. El módulo devuelve las diferencias en los diff campos 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 parámetro del config_mode módulo. Los modos de configuración admitidos incluyen:
-
batch -
dynamic -
ephemeral -
exclusive -
private
De forma predeterminada, el juniper.device.config módulo realiza cambios en la base de datos de configuración del candidato mediante configure exclusive el modo. Configurar modo exclusivo 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 para realizar los cambios de configuración solicitados. El bloqueo de la base de datos impide que otros usuarios modifiquen o confirmen cambios en la base de datos al mismo tiempo.
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"
En el siguiente manual, se utiliza private 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 usar el juniper.device.config módulo para actualizar la base de datos de configuración efímera en dispositivos que admitan esta base de datos. La base de datos efímera es una base de datos de configuración alternativa que ofrece 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 estableciendo el argumento del load módulo en el valor de la operación de carga correspondiente. La Tabla 2 resume los valores de argumento para las diferentes operaciones de carga.
|
Operación de carga |
|
Descripción |
|---|---|---|
|
|
|
Combine la configuración cargada con la configuración existente. |
|
|
|
Reemplace toda la configuración con la configuración cargada. Todos los procesos del sistema analizan la configuración. |
|
|
|
Cargue los datos de configuración desde un archivo de parche. |
|
|
|
Combine la configuración cargada con la configuración existente, pero reemplace las instrucciones de la configuración existente por instrucciones de la configuración cargada que especifiquen la |
|
|
|
Cargue los datos de configuración que están en |
|
|
|
Cargue una configuración completa y compárela con la configuración existente. Reemplace solo las partes de la configuración candidata que hayan cambiado. Durante la operación de confirmación, solo los procesos del sistema afectados 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 los datos de configuración como cadenas o archivos. Los archivos pueden contener datos de configuración o plantillas Jinja2. Cuando se proporcionan datos de configuración en 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 juniper.device.config módulo intenta detectar automáticamente el formato de los datos de configuración que se proporcionan 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. Agregue la extensión adecuada al archivo o incluya 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, anula tanto el formato de detección automática para cadenas como el formato indicado por una extensión de archivo.
|
Formato de datos de configuración |
Extensión de archivo |
|
|---|---|---|
|
Instrucciones de configuración de la CLI (texto) |
.conf |
|
|
Notación de objetos JavaScript (JSON) |
.json |
|
|
|
.set |
|
|
Elementos XML de Junos |
.xml |
|
Cuando establezca el argumento del load módulo en override o update, no puede utilizar el formato de comando de Junos OS set .
Cómo cargar los 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 adecuado load y el lines argumento. El lines argumento toma una lista de cadenas que contienen los datos de configuración que se van a 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, vea Cómo especificar el formato de los datos de configuración que se van a cargar. Si incluye el format argumento, anula el formato detectado automáticamente.
El siguiente manual configura y confirma dos scripts de op. En este caso, el load argumento tiene el valor 'set' porque los datos de configuración utilizan lines el formato de instrucción de 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 con lines los datos de configuración en formato de texto. En este caso, el ejemplo utiliza load: "merge".
---
- 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 del cliente
-
URL FTP o HTTP a la que se puede acceder desde el dispositivo del cliente
Cuando cargue 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 utilizando una plantilla Jinja2.
Para especificar el formato, incluya el parámetro del format módulo o agregue 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, vea 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 incluir los datos en la etiqueta de nivel <configuration> superior.
No es necesario incluir los datos de configuración formateados como texto, comandos de Junos OS set o JSON en <configuration-text>, <configuration-set>o <configuration-json> etiquetas como se requiere al configurar el dispositivo directamente en una sesión de NETCONF.
En la tabla 4 se describen los parámetros de módulo que puede incluir para especificar la ubicación del archivo.
|
Parámetro del módulo |
Descripción |
|---|---|
|
|
|
|
|
|
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, use el url parámetro. Especifique la ruta o la URL del archivo que se va 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 url puede ser una ruta de archivo local absoluta o relativa, una ubicación FTP o una URL HTTP.
-
La ruta 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.
-
respuesta:filename o a: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 un archivo en un servidor FTP tiene la siguiente forma:
ftp://username:password@hostname/path/filename -
La ruta de un archivo en un servidor HTTP tiene la siguiente forma:
http://username:password@hostname/path/filename
En cada caso, el valor predeterminado de la path variable es el directorio de inicio 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, brindan flexibilidad mediante el uso de expresiones y variables. Puede crear datos de configuración de Junos OS mediante plantillas Jinja2 en uno de los formatos de configuración compatibles, lo 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 and vars en la lista de argumentos del módulo.
-
template—Ruta del archivo de plantilla Jinja2 -
vars—Diccionario de claves y valores necesarios para renderizar 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, vea 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. Defina las variables requeridas por la plantilla en el vars diccionario.
En el siguiente manual, se utiliza la plantilla Jinja2 y el vars diccionario para representar los datos de configuración. El format parámetro indica el formato de los datos de configuración en el archivo de plantilla. El manual carga y confirma la configuración en el host de destino.
---
- 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. El módulo carga los datos en la configuración candidata en el dispositivo y los confirma.
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 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 revertir 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 última configuración confirmada 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, según la plataforma. Puede revertir a cualquiera de las configuraciones almacenadas. Esta característica es útil cuando los cambios de configuración generan resultados no deseados y desea revertir 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. Sin embargo, en lugar de cargar los datos de configuración, se realiza una reversión, que sustituye toda la configuración candidata por una configuración previamente confirmada.
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 reciente) y uno menos que el número de configuraciones anteriores almacenadas (el máximo es 49).
En el siguiente manual, se solicita primero el ID de reversión de la configuración que se va a restaurar. La primera tarea revierte la configuración a la versión solicitada y la confirma. La segunda tarea imprime las diferencias de configuración en la salida 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 usa el juniper.device.config módulo para modificar la configuración, 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 or 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 del módulo que se pueden usar para especificar distintas 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 confirmación del dispositivo. |
– |
|
|
Confirme los cambios de configuración o confirme una operación de confirmación confirmada anteriormente. |
|
|
|
Confirme la configuración incluso si la configuración candidata no tiene cambios. |
|
|
|
Sincronice y confirme la configuración en todos los motores de enrutamiento, incluso si el otro motor de enrutamiento tiene sesiones de configuración abiertas o cambios de configuración no confirmados. |
|
|
|
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 no confirma la confirmación en el tiempo especificado, revierta a la configuración confirmada anteriormente. Confirme la confirmación mediante la |
– |
|
|
Espere a que finalice la operación con 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.
Comprobación de confirmación
De forma predeterminada, el juniper.device.config módulo ejecuta una comprobación de confirmación y 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 confirmación, comprobació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 libere el bloqueo de configuración antes de iniciar la operación de confirmación. Si el dispositivo inicia 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, se producirá un error en la operación de confirmación y el módulo emitirá un CommitErrorarchivo .
Confirmar cambios vacíos
De forma predeterminada, si la configuración candidata y la configuración confirmada no tienen diferencias, el módulo no confirma los cambios. Para forzar una operación de confirmación incluso cuando no hay 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 si incluye el commit_sync: true argumento. Para forzar que la commit synchronize operación se realice correctamente, incluso si el otro motor de enrutamiento tiene sesiones de configuración abiertas o cambios de configuración no confirmados, use el commit_force_sync: true argumento. Cuando se incluye esta 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 confirmación
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 no confirma la confirmación dentro del límite de tiempo establecido, la configuración se revierte automáticamente a la configuración confirmada anteriormente. El intervalo 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 provoca otros errores, la reversión automática a la configuración anterior habilita el acceso al dispositivo una vez finalizada la fecha límite de reversión. Para confirmar la operación de confirmación, invoque el módulo con el juniper.device.config check: true argumento or commit: true .
En el manual siguiente, 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 un plazo de 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 pasan ciertos 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 conveniente suprimir las RpcError excepciones que se generan en respuesta a las advertencias para las operaciones de carga y confirmación. Puede indicar al módulo que suprima RpcError las juniper.device.config excepciones que se generan 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 de 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 una lista de cadenas que contengan las advertencias que se deben ignorar. En el siguiente ejemplo, se ignoran 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 elementos tienen un nivel de <rpc-error> gravedad de advertencia y cada advertencia de la respuesta coincide con una o varias 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 config configuración en un dispositivo Junos mediante NETCONF mediante SSH.
- Requisitos
- Descripción general
- Configuración
- Ejecute el manual
- Verificación
- Solución de errores del libro de estrategias
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.devicecolección instalada -
Dispositivo Junos con NETCONF habilitado y una cuenta de usuario configurada con los permisos adecuados
-
Par de claves pública/privada SSH configurado para el usuario adecuado en el controlador de Ansible y el dispositivo de Junos
-
Archivo de inventario de Ansible existente con los hosts necesarios definidos
Descripción general
En este ejemplo, se presenta un manual de estrategia de Ansible que utiliza el juniper.device.config módulo para habilitar una nueva secuencia de comandos operativa 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 pertinentes formateados como texto.
El manual incluye la Check NETCONF connectivity tarea, que utiliza el ansible.builtin.wait_for módulo 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 de la reproducción para ese dispositivo.
El manual utiliza el juniper.device.file_copy módulo para copiar la nueva secuencia de comandos operativa desde el nodo de control de Ansible al dispositivo de Junos. Los argumentos del módulo especifican el directorio y el nombre de archivo de la secuencia de comandos en el dispositivo local y el directorio de destino en el dispositivo remoto.
La tarea para configurar el dispositivo ejecuta el módulo, juniper.device.config siempre y cuando la comprobación de NETCONF se haya realizado correctamente. El load: "merge" argumento carga los datos de configuración nuevos en la configuración candidata mediante una load merge operación. De forma predeterminada, el módulo confirma los config datos de configuración en un dispositivo para load y rollback las operaciones. Los argumentos del módulo incluyen el comment argumento, que registra un comentario de confirmación en el archivo de registro del sistema del dispositivo y en el historial de confirmaciones.
Configuración
Cree el archivo de datos de configuración
Procedimiento paso a paso
Para crear el archivo de datos de configuración que utiliza el módulo:
-
Cree un nuevo archivo con la extensión adecuada en función del 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 de estrategias que utilice el módulo para realizar cambios de config configuración en un dispositivo Junos:
-
Incluya el texto reutilizable 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 la nueva secuencia de comandos operativa 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 confirmarla.
- 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 de Ansible, revise el manual de estrategias completado. Si el manual no muestra el código deseado, repita las instrucciones de este ejemplo para corregirlo.
---
- 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 manual
Para ejecutar el manual de estrategias:
-
Emita el
ansible-playbookcomando en el nodo de control y proporcione la ruta del libro de estrategias 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 de 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 confirmar, 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
Solución de errores del libro de estrategias
- Solución de problemas de errores de tiempo de espera
- Solución de errores de bloqueo de configuración
- Solución de errores de cambio de configuración
Solución de problemas de errores de tiempo de espera
Problema
El manual genera un mensaje de TimeoutExpiredError error y no se puede actualizar 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 mayor que el intervalo de tiempo de espera de RPC predeterminado, establezca el argumento del timeout módulo en un valor adecuado y vuelva a ejecutar el manual.
Solución de 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 bien
FAILED! => {"changed": false, "msg": "Unable to open the configuration in exclusive mode: LockError(severity: error, bad_element: lock-configuration, message: permission denied)"}
Un error de bloqueo de configuración puede producirse 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 confirmó.
-
El usuario que ejecuta el módulo de Ansible no tiene permisos para configurar el dispositivo.
Solución
La LockError cadena de mensajes suele indicar la causa raíz del problema. Si otro usuario tiene un bloqueo exclusivo en la configuración o la modificó, espere hasta que se libere el bloqueo o se confirmen los cambios, y vuelva a ejecutar la estrategia. 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.
Solución de errores de cambio de configuración
Problema
El manual genera un ConfigLoadError mensaje de error que indica que no se puede modificar la configuración porque se deniega 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.