Come vedere stdout di comandi rispondibili?


165

Come vedo stdout per i comandi di ansible-playbook? -v mostra solo l'output rispondibile, non i singoli comandi. Sarebbe bello se riuscissi a capire come farlo immediatamente, quindi se qualcosa fallisce o si blocca posso capire perché.

per esempio

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

stamperebbe

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

hello


Risposte:


165

Penso che puoi registrare il risultato in una variabile, quindi stampare con il debug.

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

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

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

26
Inoltre, è possibile eseguire il debug di una variabile direttamente con - debug: var=hello. A volte questo è più utile per l'uscita multilinea o l'uscita del modulo Ansible (piuttosto che command/ shelloutput).
geerlingguy

4
Ho avuto problemi a ottenere l'output Java usando questo. La correzione è reindirizzare tutto l'output di Java su stdout:shell: java -version 2>&1
Matthias Braun

20
è molto meglio niente, ma ricevi il messaggio stdout solo dopo che il comando è stato completato con successo. Stavo avendo un problema in cui Ansible sembrava bloccarsi. Il motivo era che stavo usando un nome utente errato per un comando rsync, che ha inviato la richiesta di password interattiva, che ha semplicemente bloccato ansible. È stato molto difficile eseguire il debug - ma se avessi potuto vedere stdout in tempo reale, avrei immediatamente capito cosa avevo fatto di sbagliato. ADORO questa funzionalità, se possibile.
Michael B,

10
mentre funziona, significa che ansible rende il debug davvero difficile. Immaginiamo che il primo compito non finisca mai (forse è stupidamente in attesa dell'input dell'utente) ... l'utente non lo saprebbe mai! Inoltre, il registermodulo, o qualunque cosa sia, non produce oggetti con l' impostazione della variabile stdouto stderr... quindi è davvero un male che non si ottenga semplicemente l'output di default: |
vlad-ardelean,

96

Invece di stdout , suggerirei di usare stdout_lines . Per l'output multilinea è molto più bello, ad es

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

Per quanto riguarda l'output in tempo reale per scopi di debug, esiste una segnalazione bug chiusa https://github.com/ansible/ansible/issues/3887#issuecomment-54672569 che discute i motivi per cui ciò non è possibile e non verrà implementato.


16
+1 per il collegamento del bug "output in tempo reale".
ntc2,

Se desidero inviare out.stdout_lines (come corpo dell'attività di posta elettronica Ansible), come posso inviarlo in modo che NON assomigli a questo quando riceve l'email? [u'total 61 ', u'lrwxrwxrwx 1 root root 7 febbraio 15 2015 bin -> usr / bin', u'drwxr-xr-x 6 root root 1024 24 agosto 22:08 boot ', u' .... . '] Voglio che assomigli a questo, come visto sul terminal
Chris F

fatale: [127.0.0.1]: FAILED! => {"reason": "Errore di sintassi durante il caricamento di YAML. \ n non trovato atteso <inizio documento> \ n \ nL'errore sembra essere in ... problema di sintassi. \ n \ nLa riga offensiva sembra essere: \ n \ n \ n- nome: esegui ls.sh e genera \ "ls / \" \ n ^ qui \ n "}
Nate

20

Ho scoperto che l'uso di minimal stdout_callback con ansible-playbook ha prodotto risultati simili all'uso di ansible ad hoc.

Nel tuo ansible.cfg (Nota che sono su OS X, quindi modifica il callback_pluginspercorso per adattarlo alla tua installazione)

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

In modo che un'attività come questa

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

Fornisce un output in questo modo, come farebbe un comando ad hoc

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

Sto usando ansible-playbook 2.2.1.0


Simpatico plug-in di callback, la semplice post-elaborazione può estrarre solo output standard.
RichVel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.