![Ansible: Erro fatal gerado por include_tasks mesmo se um bloco de resgate de bloco for usado](https://rvso.com/image/717732/Ansible%3A%20Erro%20fatal%20gerado%20por%20include_tasks%20mesmo%20se%20um%20bloco%20de%20resgate%20de%20bloco%20for%20usado.png)
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
/ rescue
não evita que erros aconteçam. Ele detecta tarefas com falha e executa rescue
o 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
/ fail
mó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.