¿Cómo ver stdout de comandos ansibles?

165

¿Cómo veo stdout para los comandos ansible-playbook? -v solo muestra resultados ansibles, no los comandos individuales. Sería genial si pudiera descubrir cómo hacer esto de inmediato, por lo que si algo falla o se cuelga, puedo ver por qué.

p.ej

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

imprimiría

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

hello
QuinnBaetz
fuente

Respuestas:

165

Creo que puede registrar el resultado en una variable, luego imprimir con depuración.

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

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

- debug: msg="{{ hello.stderr }}"
bfschott
fuente
26
Además, puede depurar una variable directamente con - debug: var=hello. A veces, esto es más útil para la salida multilínea o la salida del módulo Ansible (en lugar de command/ shelloutput).
geerlingguy
44
Tuve problemas para obtener la salida de Java usando esto. La solución es redirigir toda la salida de Java a stdout:shell: java -version 2>&1
Matthias Braun
20
eso es mucho mejor nada, pero solo recibe el mensaje stdout después de que el comando se haya completado con éxito. Estaba teniendo un problema en el que ansible parecía colgar. La razón fue que estaba usando el nombre de usuario incorrecto para un comando rsync, que puso en cola la solicitud de contraseña interactiva, que simplemente colgó ansible. Fue muy difícil de depurar, pero si pudiera ver stdout en tiempo real, me habría dado cuenta inmediatamente de lo que había hecho mal. Me encantaría esta funcionalidad, si es posible.
Michael B
10
Si bien esto funciona, significa que Ansible hace que la depuración sea realmente difícil. Imaginemos que la primera tarea nunca termina (quizás está esperando tontamente la entrada del usuario) ... ¡el usuario nunca lo sabría! Además, el registermódulo, o lo que sea, no produce objetos que tengan el conjunto de variables stdouto stderr... así que es realmente malo que no solo obtengamos la salida por defecto: |
vlad-ardelean
96

En lugar de stdout , sugeriría usar stdout_lines . Para salida multilínea, esto es mucho mejor, por ejemplo

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

    - debug: var=out.stdout_lines

da

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"
        ]
    }
}

Con respecto a la salida en tiempo real para fines de depuración, hay un informe de error cerrado https://github.com/ansible/ansible/issues/3887#issuecomment-54672569 que discute las razones por las que esto no es posible y no se implementará.

Marte
fuente
16
+1 para vincular el error "salida en tiempo real".
ntc2
Si deseo enviar out.stdout_lines (como cuerpo de la tarea de correo Ansible), ¿cómo puedo enviarlo para que NO se vea así cuando se recibe un correo electrónico? [u'total 61 ', u'lrwxrwxrwx 1 root root 7 15 de febrero de 2015 bin -> usr / bin', u'drwxr-xr-x 6 root root 1024 ago 24 22:08 boot ', u' ... . '] Quiero que se vea así, como se ve en la terminal
Chris F
fatal: [127.0.0.1]: ¡FALLIDO! => {"motivo": "Error de sintaxis al cargar YAML. \ n no encontró el <inicio del documento esperado> \ n \ nEl error parece estar en ... problema de sintaxis. \ n \ nLa línea ofensiva parece ser: \ n \ n \ n- nombre: Ejecute ls.sh y salida \ "ls / \" \ n ^ here \ n "}
Nate
20

Descubrí que usar el mínimo stdout_callback con ansible-playbook dio un resultado similar al uso de ad-hoc ansible.

En su ansible.cfg (tenga en cuenta que estoy en OS X, así que modifique la callback_pluginsruta para adaptarla a su instalación)

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

Para que una tarea como esta

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

Da resultados como este, como lo haría un comando ad-hoc

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

Estoy usando ansible-playbook 2.2.1.0

Jason S
fuente
Agradable complemento de devolución de llamada, simple procesamiento posterior solo puede extraer la salida estándar.
RichVel