Ansible: Erro fatal gerado por include_tasks mesmo se um bloco de resgate de bloco for usado

Ansible: Erro fatal gerado por include_tasks mesmo se um bloco de resgate de bloco for usado

Estou tentando incluir várias tarefas com base em alguns valores definidos em um hostvar, mas alguns erros fatais são gerados mesmo se eu estiver usando o bloco de resgate de bloco. eu tenho a variávelperfisdefinido emhost_vars/hostname.yml:

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

e o papelperfis_testeem/etc/ansible/roles. Aqui, no diretório de tarefas, tenho os seguintes arquivos .yml:perfil1.yml, perfil2.yml, principal.yml.

O conteúdo do arquivo main.yml é:

- 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

O conteúdo do manual é:

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

A saída é algo assim:

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

Do meu ponto de vista, esse erro fatal não deveria aparecer. O que estou fazendo de errado aqui e como posso me livrar disso? Eu também tentei com umquandocondicional, mas sem sucesso.

estou a usarAnsible 2.4.2.0e as tarefas são executadas para alguns hosts do Windows.

Responder1

block/ rescuenão evita que erros aconteçam. Ele detecta tarefas com falha e executa rescueo bloco para se recuperar do erro. Mas a tarefa falhada ainda está lá e ficará visível na recapitulação do jogo.

Eu recomendo usar uma abordagem rápida ao projetar manuais. No seu caso, você pode verificar seus arquivos locais para testar se a entrada do usuário (configuração fornecida) é válida: se os arquivos de perfis estão em vigor. Usuário assert/ failmódulos.

Responder2

No final, removi o bloco de resgate de bloco. Descobri uma maneira de verificar se meu arquivo .yml existe. Isso está usando orole_pathvariável (que retornará o caminho da função atual - disponível desde o Ansible 1.8 - funciona apenas dentro de uma função) e o testeé_arquivo.

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 esta 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.

informação relacionada