Como ver stdout de comandos ansible?

165

Como vejo stdout para comandos ansible-playbook? -v mostra apenas saída ansible, não os comandos individuais. Seria ótimo se eu pudesse descobrir como fazer isso imediatamente, então, se algo falhar ou travar, eu posso ver o porquê.

por exemplo

- name: print to stdout
  action: command echo "hello"

imprimiria

TASK: [print variable] ******************************************************** 

hello
QuinnBaetz
fonte

Respostas:

165

Eu acho que você pode registrar o resultado em uma variável e depois imprimir com depuração.

- name: print to stdout
  command: echo "hello"
  register: hello

- debug: msg="{{ hello.stdout }}"

- debug: msg="{{ hello.stderr }}"
bfschott
fonte
26
Além disso, você pode depurar uma variável diretamente com - debug: var=hello. Às vezes, isso é mais útil para saída de múltiplas linhas ou saída do módulo Ansible (em vez de command/ shelloutput).
geerlingguy
4
Eu tive problemas para obter a saída do Java usando isso. A correção é redirecionar toda a saída do Java para o stdout:shell: java -version 2>&1
Matthias Braun
20
isso é muito melhor, mas você só recebe a mensagem stdout após a conclusão do comando. Eu estava tendo um problema em que o ansible parecia travar. O motivo foi que eu estava usando o nome de usuário errado para um comando rsync, que colocou em spool a solicitação de senha interativa, que foi interrompida. Foi muito difícil depurar - mas se eu pudesse ver stdout em tempo real, teria percebido imediatamente o que havia feito de errado. Eu adoraria essa funcionalidade, se possível.
Michael B
10
enquanto isso funciona, significa que o ansible torna a depuração muito difícil. Vamos imaginar que a primeira tarefa nunca termine (talvez seja tolamente esperar pela entrada do usuário) ... o usuário nunca saberia! Além disso, o registermódulo, ou o que quer que seja, não produz objetos com a variável stdoutou stderrdefinida .... portanto, é muito ruim que não apenas obtenhamos a saída por padrão: |
Vlad-ardelean
96

Em vez de stdout , sugiro usar stdout_lines . Para saída multilinha, isso é muito melhor, por exemplo

- hosts: all
  tasks:
    - name: Run ls.sh and output "ls /"
      script: ls.sh
      register: out

    - debug: var=out.stdout_lines

TASK: [debug var=out.stdout_lines] ******************************************** 
ok: [local] => {
    "var": {
        "out.stdout_lines": [
            "total 61", 
            "lrwxrwxrwx   1 root root     7 Feb 15  2015 bin -> usr/bin", 
            "drwxr-xr-x   6 root root  1024 Aug 24 22:08 boot", 
            "drwxr-xr-x  22 root root  3580 Sep  8 18:41 dev",  
            [...] 
            "drwxr-xr-x   9 root root  4096 Aug 25 19:14 usr", 
            "drwxr-xr-x  13 root root  4096 Feb 25  2015 var"
        ]
    }
}

Em relação à saída em tempo real para fins de depuração, há um relatório de bug fechado https://github.com/ansible/ansible/issues/3887#issuecomment-54672569 discutindo os motivos pelos quais isso não é possível e não será implementado.

Marte
fonte
16
+1 para vincular o erro "saída em tempo real".
Ntc2 26/11/2015
Se eu quiser enviar out.stdout_lines (como corpo da tarefa de correio Ansible), como posso enviá-lo para que NÃO fique assim quando o email for recebido? [u'total 61 ', u'lrwxrwxrwx 1 raiz raiz 7 fev 15 2015 bin -> usr / bin', u'drwxr-xr-x 6 raiz raiz 1024 24 de agosto 22:08 inicialização ', u' .... . '] Eu quero que fique assim, como pode ser visto no terminal
Chris F
fatal: [127.0.0.1]: FALHOU! => {"reason": "Erro de sintaxe ao carregar o YAML. \ n não encontrou o esperado <início do documento> \ n \ nO erro parece estar em ... problema de sintaxe. \ n \ nA linha incorreta parece ser: \ n \ n \ nome n-: Executar ls.sh e saída \ "ls / \" \ n ^ aqui \ n "}
Nate
20

Descobri que usar o mínimo stdout_callback com o ansible-playbook produzia resultados semelhantes ao uso ad-hoc ansible.

No seu ansible.cfg (Observe que estou no OS X, modifique o callback_pluginscaminho para se adequar à sua instalação)

stdout_callback     = minimal
callback_plugins    = /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ansible/plugins/callback

Para que uma tarefa como esta

---
- hosts: example
  tasks:
   - name: Say hi
     command: echo "hi ..."

Dá saída assim, como um comando ad-hoc

example | SUCCESS | rc=0 >>
hi ...

Estou usando o ansible-playbook 2.2.1.0

Jason S
fonte
Bom plugin de retorno de chamada, um pós-processamento simples pode extrair apenas a saída padrão.
RichVel