Ansible: Fatal error thrown by include_tasks even if a block-rescue block is used

ansibleansible-playbook

I am trying to include multiple tasks based on some values defined in one hostvar but some fatal errors are thrown even if I'm using the block-rescue block.
I have the variable profiles defined in host_vars/hostname.yml:

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

and the role test_profiles in /etc/ansible/roles. Here, into the tasks directory I have the following .yml files: profile1.yml, profile2.yml, main.yml.

The content of main.yml file is:

- 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

Playbook's content is:

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

The output is something like this:

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

From my point of view that fatal error should not appear. What am I doing wrong here and how can I get rid of this? I've also tried with a when conditional but without success.

I'm using Ansible 2.4.2.0 and the tasks are performed for some windows hosts.

Best Answer

block/rescue does not prevent error from happening. It detects failed task and execute rescue block to recover from the error. But the failed task is still there and will be visible in play recap.

I'd recommend to use fail fast approach when designing playbooks. In your case you can scan your local files to test if user input (supplied configuration) is valid: whether profiles files are in place. User assert/fail modules.