1
En este artículo, nos centraremos en uno de los aspectos más importantesAnsibletemas-“Gestión de errores en los libros de jugadas de Ansible”. Al final de este artículo, debe tener una buena cantidad de conocimiento sobreManejo de errores de Ansibley comomanejar diferentes errores al ejecutar playbooks en Ansibleen linux
Manejo de errores en Playbooks
Los errores y errores son muy comunes en cualquier software que utilice. Ansible no es una excepción. Cuando comienza a trabajar en un proyecto del mundo real con ansible, se enfrentará a todo tipo de errores, ya sea un error del producto o un error humano.
Algunos errores se pueden evitar implementando las mejores prácticas y usando herramientas que tienen funciones de depuración y depuración. En este caso, mi sugerencia es usarvscodeque tiene un excelente ecosistema de complementos para admitir el desarrollo ansible.
Eche un vistazo a las siguientes extensiones de vscode que le permiten implementar las mejores prácticas aplicando algunas reglas y detectando errores sintácticos básicos.
- https://github.com/adrienverge/yamllint
- https://marketplace.visualstudio.com/items?itemName=redhat.ansible
A continuación se muestra una imagen de muestra de vscode ansible linter.
Ahora repasemos algunos escenarios para comprender los diferentes tipos de fallas y cómo manejarlas.
Cómo manejar errores de sintaxis en Ansible
Lo primero que debe verificar antes de ejecutar cualquier libro de jugadas son los errores de sintaxis. Puedes usar el“--syntax-check
“bandera junto con laansible-playbook
Comando para comprobar si hay un error de sintaxis.
Echa un vistazo al siguiente libro de jugadas. Tengo dos problemas. La función de palabra clave no es una palabra clave válida, debería ser"roles". El segundo problema es que ambos roles no son roles válidos.
--- - name: Handle Failure hosts: localhost role: - sample-role1 - sample-role2
Cuando ejecuto el libro de jugadas con--syntax-check
detecta el primer error en el libro de jugadas.
$ ansible-playbook --syntax-check playbook.yml
Una vez que corrijo el error y vuelvo a enviar el libro de jugadas, me muestra el siguiente error donde elmuestra-rol1no se encuentra en ninguna parteroles_path
ubicaciones.

El problema con este enfoque es que cuando tiene un par de errores en el libro de jugadas, solo mostrará el primer error y tendrá que corregir los errores y volver a enviar el comando para ver el siguiente error.
Cómo manejar fallas de tareas en Ansible
Antes de saber cómo solucionar una tarea fallida, debe saber cómo ansible envía las tareas y qué sucede cuando falla una tarea.
Ansible envía las tareas en el orden definido en lotes (tenedores = 5). Cuando una tarea en particular falla en un host, ansible marcará el host y detendrá la ejecución de más tareas en el host.
Puede manejar fallas a nivel de tarea utilizando cualquiera de los siguientes enfoques.
- Usando la directiva ignore_errors.
- Agrupación de tareas bajo la directiva de bloque.
1. Manejo de fallas usando la directiva Ignore_errors
Considere el siguiente libro de jugadas que tiene dos tareas para descargar e instalar el chrome paquete de deuda
--- - name: Handle Failure with ignore_erros hosts: localhost tasks: - name: Download chrome .deb file ansible.builtin.get_url: url: https://dl.google.com/linux/direct/google-chrome-stable_current_amd641.deb dest: /tmp/chrome.deb - name: Install from /tmp/chrome.deb ansible.builtin.apt: deb: /tmp/chrome.deb
Indiqué a propósito la URL incorrecta, lo que hará que la primera tarea falle. Como ya se indicó, una vez que una tarea falla en el host, no se enviará ninguna otra tarea al host. Así que la segunda tarea no se envía.
fatal: [localhost]: FAILED! => {"changed": false, "dest": "/tmp/chrome.deb", "elapsed": 0, "msg": "Request failed", "response": "HTTP Error 404: Not Found", "status_code": 404, "url": "https://dl.google.com/linux/direct/google-chrome-stable_current_amd641.deb"}
Ahora déjame ejecutar el mismo libro de jugadas otra vez pero con“ignore_errors= true
“.

Si observa la imagen de arriba, la primera tarea se ejecutó y falló, pero se ignora la falla que hizo que se ejecutara la segunda tarea.
Aviso:Elignore_errors
La directiva se puede agregar en el nivel de tarea o nivel de juego.
2. Manejo de errores usando directivas Block-Rescue-Always
A veces, los grupos de tareas dependen entre sí y si una sola tarea falla, la tarea dependiente por sí sola no debe ejecutarse en lugar de detener todas las tareas en los hosts particulares.
El libro de jugadas utilizado en la sección anterior será un perfecto example de este escenario. La tarea de instalación depende de la tarea de descarga, por lo que ambas tareas se pueden agrupar bajo la directiva de bloque.
--- - name: Handle Failure with ignore_erros hosts: localhost tasks: - name: Group the tasks block: - name: Download chrome .deb file ansible.builtin.get_url: url: https://dl.google.com/linux/direct/google-chrome-stable_current_amd641.deb dest: /tmp/chrome.deb - name: Install from /tmp/chrome.deb ansible.builtin.apt: deb: /tmp/chrome.deb ignore_errors: true
Usé el mismo libro de jugadas pero moví ambas tareas bajo la directiva de bloque y agreguéignore_errors
a nivel de bloque. Si observa el resultado a continuación, ambas tareas heredaron automáticamente elignore_errors
directiva.

También puede agregar el“rescue
“y“always
“directivas junto con la“block
“directiva. La tarea bajo elrescue
se ejecutará si alguna de las tareas bajo lablock
la directiva falla. Esto es muy útil para las actividades de limpieza. La directiva siempre se ejecuta independientemente del estado deblock
yrescue
directivas.
he añadido elrescue
yalways
directivas con tareas que imprimen algunos mensajes.
tasks: - name: Group the tasks block: - name: Download chrome .deb file ansible.builtin.get_url: url: https://dl.google.com/linux/direct/google-chrome-stable_current_amd641.deb dest: /tmp/chrome.deb - name: Install from /tmp/chrome.deb ansible.builtin.apt: deb: /tmp/chrome.deb rescue: - name: Rescue task ansible.builtin.debug: msg: "Some cleanup activity..." always: - name: Task that always runs ansible.builtin.debug: msg: "Task that always run"
Elrescue
La tarea se ejecutó porque la tarea en la sección de bloques falló. Finalmente, elalways
se ejecutaron las tareas.

Cómo detener todas las jugadas en caso de falla
En la última sección, hemos visto formas de ejecutar las tareas incluso si una tarea falla. En algunos casos, necesitamos que todo el libro de jugadas se detenga incluso si falla una sola tarea. Esto se puede lograr estableciendo“any_errors_fatal: true
“.

Cuando el libro de jugadas se envía con “any_errors_fatal
y si una tarea falla, las tareas enviadas en el lote actual se ejecutarán y la reproducción se detendrá.
Aviso:la directivaany_errors_fatal
se puede configurar en el nivel de juego o en el nivel de tarea.
Cómo manejar el error de host inalcanzable en Ansible
Otro tipo de error en ansible es“host inalcanzable”. Obtendrá este error cuando ansible no pueda conectarse al host administrado definido en el archivo de inventario. Esto sucede debido a muchas razones. Es posible que haya proporcionado una definición de host incorrecta o que haya un problema con el host administrado.
Si ansible encuentra que no se puede acceder a un nodo, lo eliminará de la lista de hosts activos y no enviará más tareas en el nodo.
Estoy ejecutando el mismo libro de jugadas utilizado en la sección anterior pero con algún nombre de host aleatorio. La tarea falló con“inalcanzable”.

Puedes añadir “ignore_unreachable: true
” en el nivel de tarea o juego, que omitirá la tarea actual y ejecutará la siguiente tarea sin eliminar el host de la lista activa.

Cómo crear fallas definidas por el usuario en Ansible
Aparte de las fallas definidas por ansible, los usuarios también pueden crear sus propias reglas para hacer que la tarea falle usando el“failed_when
“directiva. De hecho, el linter ansible sugiere usar el “failed_when
” en vez de “ignore_errors
“directiva.

Debe registrar la salida de la tarea antes de realizar algunas comprobaciones condicionales. El nombre de la variable registrada es“status
“.
Para obtener más información sobre los registros de Ansible, consulte la siguiente guía.
- Variable de registro de Ansible
He agregado una condición para verificar el código de estado de la salida registrada. El404código de estado no se considerará una falla. Ahora, cualquier otro código de retorno se considerará un error.
- name: Download chrome .deb file ansible.builtin.get_url: url: https://dl.google.com/linux/direct/google-chrome-stable_current_amd641.deb dest: /tmp/chrome.deb register: status failed_when: status.status_code != 404

También puedes agregar"Y"y"O"operadores para verificar múltiples condiciones.
failed_when: status.status_code != 404 or status.status_code != 401
Cómo manejar fallas de tareas del controlador en Ansible
Tenemos un artículo dedicado a los manipuladores. Consulte el siguiente enlace y busque la sección “Manejo de fallas” para saber cómo manejar las fallas en las tareas del controlador.
- Cómo usar controladores en libros de jugadas de Ansible
Conclusión
En este artículo, hemos discutido sobre el manejo de errores en Playbooks. También hemos visto cuáles son los diferentes tipos de fallas que encontrará en ansible y algunas de las formas de solucionarlas. Los comentarios son bienvenidos a través de la sección de comentarios.
Recurso: