Reintentar tarea fallida en Ansible

Muchas veces, cuando trabajamos con tareas de Ansible nos encontramos que en más de una ocasión, la acción falla.

Evidentemente, si este fallo es debido a una mala configuración del servidor o que Ansible no se encuentra con el estado esperado, tendremos que revisar qué está pasando para poder solucionaro.

En cambio, muchas otras veces, este error es temporal, o bien porque el servidor de destino está ocupado y no puede procesar la operación o simplemente porque se ha dado algún tipo de timeout y simplemente reintentando la tarea, ésta funcionará correctamente.

Para poder reintentar una tarea de Ansible de forma automática, necesitaremos registrar el resultado de la ejecución con register: task_result. Una vez tengamos esta variable, haremos los correspondientes reintentos until: task_result.rc == 0, con la opción retries: xx dónde xx será el número de intentos a hacer. También podemos poner la opción delay: xx para indicar cuanto tiempo dejará pasar entre intento y intento.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
---
- hosts: ESXi
  connection: local
  tasks:
    - name: Unmount datastores ESXi
      command: "{{ item }}"
      register: task_result
      until: task_result.rc == 0
      retries: 3
      delay: 10
      with_items:
        - esxcli storage filesystem unmount -l IX_Simplex000_LDEV3000
        - esxcli storage filesystem unmount -l IX_Simplex001_LDEV3001
        - esxcli storage filesystem unmount -l IX_Simplex002_LDEV3002
        - esxcli storage filesystem unmount -l IX_Simplex003_LDEV3003
        - esxcli storage filesystem unmount -l IX_Simplex004_LDEV3004

Y éste, seria el comportamiento real de esta tarea:

ansible-retry

Espero que os sirva.

Un saludo!

Miquel.

0%