Come ottengo log / dettagli delle esecuzioni del modulo ansible-playbook?


95

Diciamo che eseguo quanto segue.

$ cat test.sh
#!/bin/bash
echo Hello World
exit 0

$ cat Hello.yml
---

- hosts: MyTestHost
  tasks:
  - name: Hello yourself
    script: test.sh


$ ansible-playbook  Hello.yml

PLAY [MyTestHost] ****************************************************************

GATHERING FACTS ***************************************************************
ok: [MyTestHost]

TASK: [Hello yourself] ********************************************************
ok: [MyTestHost]

PLAY RECAP ********************************************************************
MyTestHost                    : ok=2    changed=0    unreachable=0    failed=0

$

So per certo che ha avuto successo.

Dove / come vedo "Hello World" echeggiato / stampato dal mio script sull'host remoto (MyTestHost)? O il codice di ritorno / uscita dello script?

La mia ricerca mi mostra che sarebbe possibile scrivere un plugin per intercettare i callback di esecuzione del modulo o qualcosa del genere su quelle righe e scrivere un file di log. Preferirei non sprecare il mio tempo con quello.

Ad esempio qualcosa come lo stdout in basso (nota che sto eseguendo ansible e non ansible-playbook):

$ ansible plabb54 -i /project/plab/svn/plab-maintenance/ansible/plab_hosts.txt -m script -a ./test.sh
plabb54 | success >> {
    "rc": 0,
    "stderr": "",
    "stdout": "Hello World\n"
}

$

Risposte:


113

Se passi il -vflag a ansible-playbook sulla riga di comando, vedrai lo stdout e lo stderr per ogni attività eseguita:

$ ansible-playbook -v playbook.yaml

Ansible ha anche il supporto integrato per la registrazione. Aggiungi le seguenti righe al tuo file di configurazione ansible :

[defaults] 
log_path=/path/to/logfile

Ansible cercherà in diversi punti il ​​file di configurazione:

  • ansible.cfg nella directory corrente in cui hai eseguito ansible-playbook
  • ~/.ansible.cfg
  • /etc/ansible/ansible.cfg

8
Grazie. Semplicemente avido: posso avviare / interrompere dinamicamente la registrazione da un playbook? Come set -xe set +xin uno script di shell.
Kashyap

@thekashyap Non penso che questo sia attualmente possibile.
Lorin Hochstein

9
Puoi usare il no_log: Trueflag per impedire la registrazione di un comando o di un playbook, ma credo che sia così fine come sembra.
Ade Miller

4
Potresti descrivere come devo mettere logrotatein log_pathmodo che ogni ansibleesecuzione abbia un file diverso (con il comando / playbook incluso nel file)?
mosca di polistirolo

Avevo bisogno di tre vsecondi per ottenere stdout e stderr
ricco

24

L'attività di script playbook verrà generata stdoutproprio come il comando non playbook, deve solo essere salvata in una variabile utilizzando register. Una volta ottenuto ciò, il modulo di debug può stampare sul flusso di output del playbook.

tasks:
- name: Hello yourself
  script: test.sh
  register: hello

- name: Debug hello
  debug: var=hello

- name: Debug hello.stdout as part of a string
  debug: "msg=The script's stdout was `{{ hello.stdout }}`."

L'output dovrebbe essere simile a questo:

TASK: [Hello yourself] ******************************************************** 
changed: [MyTestHost]

TASK: [Debug hello] *********************************************************** 
ok: [MyTestHost] => {
    "hello": {
        "changed": true, 
        "invocation": {
            "module_args": "test.sh", 
            "module_name": "script"
        }, 
        "rc": 0, 
        "stderr": "", 
        "stdout": "Hello World\r\n", 
        "stdout_lines": [
            "Hello World"
        ]
    }
}

TASK: [Debug hello.stdout as part of a string] ******************************** 
ok: [MyTestHost] => {
    "msg": "The script's stdout was `Hello World\r\n`."
}

ma Hello yourself task non ha dato alcun stdout
Saurabh Chandra Patel

Questo è il mio metodo preferito. Diventa bravo a usare i valori delle variabili registrate nelle istruzioni di debug e il mondo è la tua ostrica.
Joshua K

14

C'è anche un altro modo per generare il file di registro.

Prima di eseguire ansible-playbookeseguire i seguenti comandi per abilitare la registrazione:

  • Specifica il percorso per il file di registro.

    esportare ANSIBLE_LOG_PATH = ~ / ansible.log

  • Abilita debug

    export ANSIBLE_DEBUG = True

  • Per controllare il file di registro generato.

    meno $ ANSIBLE_LOG_PATH


1
ANSIBLE_DEBUG è un po 'separato dalla specifica di un file di registro. È persino separato dalla selezione della verbosità! Questo è ancora molto buono da richiamare: il debug ti darà messaggi di debug orientati allo sviluppatore, a un livello di verbosità assolutamente estremo. Bello avere intorno.
AlanSE

4

Plugin ufficiali

È possibile utilizzare i plug-in di callback di output . Ad esempio, a partire da Ansible 2.4, puoi utilizzare il plug-in di callback dell'output di debug :

# In ansible.cfg:
[defaults]
stdout_callback = debug

(In alternativa, corri export ANSIBLE_STDOUT_CALLBACK=debugprima di eseguire il tuo playbook)

Importante: devi eseguire ansible-playbookcon l' opzione -v( --verbose) per vedere l'effetto. Con stdout_callback = debugset, l'output dovrebbe ora assomigliare a questo:

TASK [Say Hello] ********************************
changed: [192.168.1.2] => {
    "changed": true,
    "rc": 0
}

STDOUT:


Hello!



STDERR:

Shared connection to 192.168.1.2 closed.

Ci sono altri moduli oltre al debugmodulo se vuoi che l'output sia formattato in modo diverso. C'è json, yaml, unixy, dense, minimal, ecc ( l'elenco completo ).

Ad esempio, con stdout_callback = yaml, l'output sarà simile a questo:

TASK [Say Hello] **********************************
changed: [192.168.1.2] => changed=true 
  rc: 0
  stderr: |-
    Shared connection to 192.168.1.2 closed.
  stderr_lines:
  - Shared connection to 192.168.1.2 closed.
  stdout: |2-

    Hello!
  stdout_lines: <omitted>

Plugin di terze parti

Se nessuno dei plugin ufficiali è soddisfacente, puoi provare il human_logplugin. Ci sono alcune versioni:


3

Usando i plugin di callback, puoi avere lo stdout dei tuoi comandi in uscita in forma leggibile con play: gist: human_log.py

Modifica per l'output di esempio:

 _____________________________________
< TASK: common | install apt packages >
 -------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


changed: [10.76.71.167] => (item=htop,vim-tiny,curl,git,unzip,update-motd,ssh-askpass,gcc,python-dev,libxml2,libxml2-dev,libxslt-dev,python-lxml,python-pip)

stdout:
Reading package lists...
Building dependency tree...
Reading state information...
libxslt1-dev is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 24 not upgraded.


stderr:

start:
2015-03-27 17:12:22.132237

end:
2015-03-27 17:12:22.136859

1

Aiuto della riga di comando Ansible, ad esempio ansible-playbook --helpmostra come aumentare la verbosità dell'output impostando la modalità dettagliata (-v) su più verbosità (-vvv) o sulla verbosità del debug della connessione (-vvvv). Questo dovrebbe darti alcuni dei dettagli che stai cercando in stdout, che puoi quindi registrare.

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.