No final, removi o bloco de resgate de blocos. Eu descobri uma maneira de verificar se o meu arquivo .yml existe. Isso está usando a variável role_path (que retornará o caminho da função atual - disponível desde o Ansible 1.8 - isso funciona apenas dentro de uma função) e o teste is_file .
Meu main.yml para a função descrita acima está assim:
- name: Import profiles
include_tasks: "{{ item }}.yml"
with_items: "{{ profiles|default([]) }}"
when: (role_path + '/tasks/' + item + '.yml') | is_file
Devido a essa verificação, uma exceção fatal não será mais lançada - o arquivo trap1.yml será ignorado.
A saída 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
Estou bem com esta solução, mas também estou aberto a outras sugestões.