Contexto
Eu tenho um manual do Ansible que inclui uma tarefa muito longa, de até uma hora.
Muito simplificado, fica assim:
- hosts: localhost
tasks:
- name: Short task
debug:
msg: "I'm quick!"
- name: Long task
shell: "sleep 15s"
Quando o usuário executa o playbook, a saída é inicialmente:
PLAY [localhost] ********************
TASK [Gathering Facts] **************
ok: [127.0.0.1]
TASK [Short task] *******************
ok: [127.0.0.1] => {
"msg": "I'm quick!"
}
(hang there until Long task is done)
TASK [Long task] ********************
changed: [127.0.0.1]
Problema
Os usuários finais do manual acreditam que há um problema, Short task
já que ele fica parado, enquanto é Long task
isso que está causando o atraso.
Pergunta
Como eu poderia configurar o ansible ou o playbook para imprimir os cabeçalhos definidos emname:
antesexecutando a tarefa?
O que eu consigo é uma saída como:
PLAY [localhost] ********************
TASK [Gathering Facts] **************
ok: [127.0.0.1]
TASK [Short task] *******************
ok: [127.0.0.1] => {
"msg": "I'm quick!"
}
TASK [Long task] ********************
(and hang there during the execution)
changed: [127.0.0.1]
Responder1
Migrando meu comentário para uma resposta a pedido do OP
Estou usando o Ansible 2.9.2.
Tentei sem arquivo de configuração e com um arquivo de configuração sem valor declarado para stdout_callback
(padrão). Não consigo reproduzir seu problema em nenhum dos casos.
Este é meu manual de teste:
---
- hosts: localhost
gather_facts: false
tasks:
- name: Short running
debug:
msg: I'm a short task
- name: LOOOOOOOOOng task
shell: sleep 2000
E o resultado (em ambos os casos. Nota: interrupção pelo usuário após exibição do cabeçalho da tarefa)
$ ansible-playbook /tmp/play.yml
PLAY [localhost] **************************************************************************************************************************************************************************************************
TASK [Short running] **********************************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": "I'm a short task"
}
TASK [LOOOOOOOOOng task] ******************************************************************************************************************************************************************************************
^C [ERROR]: User interrupted execution
Verifique qual arquivo de configuração você está carregando ansible-playbook --version
no diretório onde irá iniciar o playbook. Também sugiro que você tente sem nenhum arquivo de configuração para ver se isso resolve o seu problema (e então veja qual configuração está realmente causando o problema).
Adicionado a partir do comentário do OP: verifica-se que a configuração problemática em ansible.cfg neste caso específico eradisplay_skipped_hosts=False
Responder2
O display_skipped_hosts=false
in /etc/ansible/ansible.cfg corrigiu isso para mim.
É um bug? Não gosto de ver os hosts ignorados, mas gosto de ver o progresso do meu manual.
Usando Ansible 2.10.3
Responder3
Para quem ainda deseja ocultar tarefas ignoradas, agora existem duas opções:
- Usando oplugin de retorno de chamada padrãoe configurando
display_skipped_hosts = False
andshow_per_host_start = True
, isso adicionará outra linha de log quando cada tarefa for iniciada, no entanto, não recupera o comportamento de apenas exibir o título a tempo (e de alguma forma às vezes também aparece depois que uma tarefa já foi concluída, tornando as coisas mais difíceis ler) - Continue usando o (agora obsoleto)plugin skippyque era o plug-in obrigatório antes do plug-in padrão ter o recurso de pular. Ele ainda funciona conforme esperado com o 2.11 e também é minha solução preferida para isso. Defina
stdout_callback = skippy
em seu ansible.cfg. Só para ter certeza de que também coloquei o plugin na lista de permissões comcallback_enabled = ansible.posix.skippy
Meu ansible.cfg está assim agora e tudo funciona como antes de migrar para o ansible.cfg mais recente com padrões:
[default]
# ...
stdout_callback = skippy
# if you had other plugins here just add to list, comma seperated
callback_enabled = ansible.posix.skippy
# deprecated flag, sometimes still needed, hence I always set both
callback_whitelist = ansible.posix.skippy
# ...
Leitura adicional:
- Bilhete sobre o assunto:https://github.com/ansible/ansible/issues/51042
- PR que introduziu o recurso ao plugin padrão para adicionar saída de tarefa inicialhttps://github.com/ansible/ansible/pull/53819
- Documentos mais recentes para plugin padrãohttps://docs.ansible.com/ansible/latest/collections/ansible/builtin/default_callback.html
- Documentos mais recentes do plugin skippyhttps://docs.ansible.com/ansible/latest/collections/ansible/posix/skippy_callback.html
- Como configurar plug-ins de retorno de chamadahttps://docs.ansible.com/ansible/latest/plugins/callback.html
Responder4
No meu caso, eu estava usando a estratégia "grátis" que não mostrava o cabeçalho antes de finalizar a tarefa.