Exibir saída com Ansible

39

Eu tenho um jogo Ansible para o PGBouncer que exibe alguma saída de um módulo de estatísticas embutido no PGBouncer.

Meu problema é que, quando o Ansible imprime a saída no terminal, ele gerencia as novas linhas. Em vez de ver

----------
| OUTPUT |
----------

eu vejo

----------\n| OUTPUT |\n----------

Alguém sabe como fazer com que o Ansible "imprima" a saída?

mjallday
fonte

Respostas:

14

Não há como fazer o que você quer nativamente no Ansible. Você pode fazer isso como uma solução alternativa:

ansible-playbook ... | sed 's/\\n/\n/g'
jarv
fonte
1
No OSX eu tive que usar sed -e 's/\\n/'$'\\\n/g'. Também relevante: comicjk.com/20
Navin
4
veja sorins responder serverfault.com/a/846232/240508, que é o correto em 2017 e ansible> 2.3
Vadimo
Principalmente \naparecem no resultado, assim que você poderia usar esta expressão regular em sua mensagem de depuração:msg: "{{ result.stdout | regex_replace('\\n', '\n') }}"
klml
infelizmente, isso remove a cor agradável e útil que você obtém na saída ansible
Mehdi LAMRANI
62

Se você deseja uma saída mais amigável para o ser humano, defina:

ANSIBLE_STDOUT_CALLBACK=debug

Isso tornará possível o uso do módulo de saída de depuração (nomeado anteriormente human_log) whinch, apesar de seu nome infeliz ser menos detalhado e muito mais fácil de ser lido pelos humanos.

Se você receber um erro dizendo que este módulo não está disponível, atualize o Ansible ou adicione-o localmente se não puder atualizar o ansible, ele funcionará com versões superiores do ansible como 2.0 ou provavelmente até 1.9.

Outra opção para configurar isso é adicionar stdout_callback = debugao seu ansible.cfg

sorin
fonte
13
essa deve ser a resposta ACEITADA em 2017, a saída de log amigável para o homem é enviada imediatamente.
Vadimo 27/09
1
Aqui mais algumas dicas para tornar isso mais permanente: github.com/ansible/ansible/issues/27078#issuecomment-364560173
kramer65
1
Or ANSIBLE_STDOUT_CALLBACK=yaml. Eu prefiro porque formata bem fail msgquando forneço um objeto.
Marinos An
13

Você pode usar um plug-in de retorno de chamada . Isso analisará novamente sua saída e é facilmente ligado e desligado.

xddsg
fonte
2
Nota: Com o ansible 2.0.x, você precisa herdar dos CallbackBaseimportados from ansible.plugins.callback import CallbackBasepara que a classe de retorno de chamada funcione.
22316
12

Encontrado desta maneira no fórum do grupo Ansible Project:

- name: "Example test"
  command:
    ...
  register: test
- name: "Example test stdout"
  debug:
    msg: "{{ test.stdout.split('\n') }}"
- name: "Example test stderr"
  debug:
    msg: "{{ test.stderr.split('\n') }}"

Basicamente, transformamos isso em lista, dividindo-o por nova linha e depois imprimindo essa lista.

jhutar
fonte
Isso torna a saída do shell muito mais legível! Agradável!
Asfand Qazi
Essa solução parece ter uma grande desvantagem - se a execução do módulo "Teste de exemplo" falhar, geralmente toda a compilação do manual falhará e você nunca verá a saída formatada, especialmente a do stderr, que provavelmente é mais interessante.
René
@ René você está certo. Para isso, você pode adicionar ignore_errors: yesao comando original e, posteriormente, algo como `- assert: that:" test.rc == 0 ".
jhutar
0

Se você quiser vê-lo em um formato que praticamente imite a saída padrão, poderá usar o debugplug-in de retorno de chamada com o debugmódulo no Ansible 2.7+ como este:

- name: "Test Output"
  debug:
    msg: "{{ test_result.stdout_lines | join('\n') }}"
daveystones
fonte