Ansible: Error fatal generado por include_tasks incluso si se usa un bloque de rescate de bloque

Ansible: Error fatal generado por include_tasks incluso si se usa un bloque de rescate de bloque

Estoy tratando de incluir múltiples tareas basadas en algunos valores definidos en una variable host, pero se generan algunos errores fatales incluso si estoy usando el bloque block-rescue. tengo la variableperfilesdefinido enhost_vars/nombrehost.yml:

profiles: '["profile1","trap1"]'

y el papelperfiles_pruebaen/etc/ansible/roles. Aquí, en el directorio de tareas tengo los siguientes archivos .yml:perfil1.yml, perfil2.yml, principal.yml.

El contenido del archivo main.yml es:

- name: import profiles
   block:
     - include_tasks: "{{ item }}.yml"
       with_items: "{{ profiles|default([]) }}"
   rescue:
     - debug: msg='Error encountered while trying to include a .yml file corresponding to a defined profile from profiles variable. Profiles - "{{ profiles }}"'
   when: profiles is defined

El contenido del libro de jugadas es:

 - name: Test profiles config
   hosts: myhost
   roles:
     - test_profiles

La salida es algo como esto:

TASK [test_profiles : include_tasks] ***********************************************************************************************************************************************************************
included: /etc/ansible/roles/test_profiles/tasks/profile.yml for <my_host>
fatal: [<my_host>]: FAILED! => {"reason": "Unable to retrieve file contents\nCould not find or access '/etc/ansible/trap1.yml'"}

TASK [test_profiles : Ensure that profile directory exists into the D:\profiles directory] ************************************************************************************************
ok: [<my_host>]

TASK [test_profiles : Update profile.properties file] ***************************************************************************************************************************************************
ok: [<my_host>]

TASK [test_profiles : debug] *******************************************************************************************************************************************************************************
ok: [<my_host>] => {
    "msg": "Error encountered while trying to include a .yml file corresponding to a defined profile from profiles variable. Profiles - \"[\"profile1\",\"trap1\"]\""
}
        to retry, use: --limit @/etc/ansible/playbook_test_profiles.retry

PLAY RECAP ********************************************************************************************************************************************************************************************************
<my_host>                 : ok=5    changed=0    unreachable=0    failed=1

Desde mi punto de vista ese error fatal no debería aparecer. ¿Qué estoy haciendo mal aquí y cómo puedo deshacerme de esto? También lo he probado con uncuandocondicional pero sin éxito.

Estoy usandoAnsible 2.4.2.0y las tareas se realizan para algunos hosts de Windows.

Respuesta1

block/ rescueno evita que se produzcan errores. Detecta la tarea fallida y ejecuta rescueel bloque para recuperarse del error. Pero la tarea fallida sigue ahí y será visible en el resumen del juego.

Recomiendo utilizar un enfoque rápido ante fallos al diseñar libros de estrategias. En su caso, puede escanear sus archivos locales para probar si la entrada del usuario (configuración proporcionada) es válida: si los archivos de perfiles están en su lugar. Usuario assert/ failmódulos.

Respuesta2

Al final eliminé el bloque de rescate. Descubrí una manera de verificar si mi archivo .yml existe. Esto es usar elruta_rolvariable (que devolverá la ruta del rol actual, disponible desde Ansible 1.8, esto funciona solo dentro de un rol) y la pruebaes_archivo.

Mi main.yml para el rol descrito anteriormente tiene este aspecto:

- name: Import profiles
   include_tasks: "{{ item }}.yml"
   with_items: "{{ profiles|default([]) }}"
   when: (role_path + '/tasks/' + item + '.yml') | is_file

Debido a esta verificación, ya no se generará una excepción fatal: se omitirá el archivo trap1.yml.

La salida será algo como:

TASK [test_profiles : Import profiles] ***********************************************************
skipping: [<my_host>] => (item=trap1)
included: /etc/ansible/roles/test_profiles/tasks/profile1.yml for <my_host>

TASK [test_profiles : Ensure that profile directory exists into the D:\profiles directory] *******
ok: [<my_host>]

TASK [test_profiles : Update profile.properties file] ********************************************
changed: [<my_host>]
        to retry, use: --limit @/etc/ansible/playbook_test_profiles.retry

PLAY RECAP ***************************************************************************************
<my_host>                 : ok=4    changed=1    unreachable=0    failed=0

Estoy de acuerdo con esta solución, pero también estoy abierto a otras sugerencias.

información relacionada