Come posso registrare l'output dell'attività in un file?


10

Una delle mie attività di risposta importa un database Oracle utilizzando impdp.

Questo genera un sacco di output per la console, quindi ho impostato no_log: True.

Tuttavia, quando fallisce, voglio vedere il registro!

Come posso fare questo particolare registro attività su un file e non sulla console?


Stai usando il modulo di comando?
Boicottaggio SE per Monica Cellio,

Un'idea [più di un trucco] sarebbe quella di scrivere i registri su un file esterno, e quindi avere un'attività dopo di esso che fa uso della failed_whencondizione e rimuovere il file di registro, se il precedente. compito andato a buon fine :)
Dawny33

Perché riesci comunque a vedere l'output della console durante le esecuzioni riuscite? Non ho visto una configurazione per, né pensavo fosse possibile, mostrare stdout durante una corretta esecuzione dell'attività, dovrebbe venire solo [ok: nome host]. Tuttavia, quando viene rilevato un errore, l'output viene scaricato nella console di controllo ansible (e vengono definiti eventuali registri ansible) ti dispiacerebbe condividere la configurazione che ti dà lo stdout di grandi dimensioni durante una normale esecuzione corretta?
hvindin,

@hvindin Inserisci -vvvdopo il ansible-playbookcomando per ottenere registri dettagliati.
Dawny33

1
Registrare una variabile sembra la mossa logica migliore, vedi il mio commento sulla tua risposta per le mie opinioni su cosa fare con gli output dei comandi innescati rispondibili.
hvindin,

Risposte:


4

[Convertire il mio commento in una risposta]

Un modo per farlo sarebbe quello di scrivere i log in qualche file esterno, e quindi avere un'attività dopo di esso che utilizza la condizione failure_when e rimuovere il file di registro, se l'attività precedente ha avuto esito positivo.

Qualcosa del genere dovrebbe aiutarti.

 - name: Run Py script
      command: <>.py  > <>.log
      become: yes
      register: PyScript
      ignore_errors: True

    - name: PyScript on success
      command: rm <>.log
      when: PyScript|succeeded

Nota: questo potrebbe non essere il modo migliore per gestire il tuo problema. Ma questo è stato un trucco che mi ha aiutato a fare il mio logging e monitoraggio.


2
Andrei oltre e direi che potresti mantenere il tuo comando scrivendo su stdout / stderr e poi scaricarli come risposta a un fallimento. Quindi, come esempio nell'esempio sopra riportato, se si desidera arrestare l'esecuzione in caso di errore, utilizzare un'attività fallita per generare semplicemente lo stdout e lo stderr registrati in PyScript quando rc! = 0 sembrerebbe una soluzione più olistica. Se si utilizzano i meccanismi integrati di Ansibles, se si dispone della registrazione con risposta configurabile su un server di controllo, ad esempio, quel server di controllo registrerebbe l'errore nel registro di risposta. Quale penso che sarebbe il posto giusto per questo
hvindin

3

Penso che tutto ciò che devi fare sia registrare l'output di ogni comando che ti serve (archiviarlo in una variabile) e quindi semplicemente scaricare la variabile in un file. In questo modo puoi rivederlo in seguito.

tasks:
  - name: Dump all vars
    action: template src=templates/dumpall.j2 dest=/tmp/ansible.all

Quindi in dumpall.j2:

Module Variables ("vars"):
--------------------------------
{{ vars | to_nice_json }} 

Environment Variables ("environment"):
--------------------------------
{{ environment | to_nice_json }} 

GROUP NAMES Variables ("group_names"):
--------------------------------
{{ group_names | to_nice_json }}

GROUPS Variables ("groups"):
--------------------------------
{{ groups | to_nice_json }}

HOST Variables ("hostvars"):
--------------------------------
{{ hostvars | to_nice_json }} 

L'esempio che sto usando è da qui


3

Ho risolto questo aggiungendo

ignore_errors: true
register: results

all'attività no_log. Questo rende ansible continuare con l'attività successiva, anche quando l'attività fallisce. Quindi per l'attività successiva definire un'attività di debug, che ha sempre esito negativo e genera la variabile registrata, ma viene eseguita solo quando l'attività precedente non è riuscita:

- name: Error output
  debug:
     var: results
  failed_when: true
  when:
     results is failed

Quindi, anche con no_log: true, questo renderà ansible visualizzare l'output dell'attività fallita. Questa soluzione non sta registrando su un file come richiesto, ma soddisfa pienamente la necessità di "vedere il registro in caso di errore" e, naturalmente, è possibile reindirizzare o utilizzare tee per generare l'output completo di un file, che con questa soluzione contiene anche il registro dell'attività non riuscita.


2

Quello che faccio quando ho un comando da eseguire e desidero ottenere il registro solo in caso di errore è il seguente (preceduto da una shell comamnd come /bin/sh -c '...'nel caso in cui l'iniziatore non usi una systemchiamata o esegua il comando direttamente senza shell) :

command 2&>1 > command-log.txt || cat command-log.txt

Ciò reindirizzerà l'errore e l'output standard su un file e visualizzerà il contenuto del file solo in caso di errore. Se il comando è molto dettagliato e non desideri mantenere il registro quando è ok, puoi procedere con:

command 2&>1 > command-log.txt && rm command-log.txt || cat command-log.txt

Preventivo &&e ||utilizzo dalla pagina man sh :

Il simbolo && (||) fa sì che l'elenco seguente venga eseguito solo se la pipeline precedente restituisce un valore zero (diverso da zero).

Questo non è probabilmente il modo più idiomatico per farlo con ansible ma ha il vantaggio di essere molto portatile con qualsiasi sistema di gestione della configurazione che dà la possibilità di visualizzare il comando stdout.


0

Supponendo che responsible genera correttamente errori su stderr, è possibile acquisire l'output degli errori in qualsiasi programma su un file usando il reindirizzamento dell'output:

some command 2> error.log

Tuttavia non penso che sia così.

Invece probabilmente vorrai fare riferimento a questa guida per decidere quando si verificheranno gli errori http://docs.ansible.com/ansible/playbooks_error_handling.html e quindi grep il tuo output per stringhe che indicano un errore prima di eseguire l'output in un file

vale a dire.

ansible-playbook my-playbook | grep 'error' > error.log


-2

Penso che quello che stai cercando potrebbe essere troppo semplicemente reindirizzare stdout e street to file.

In genere, some-command &> logfile.log

o qualche variante ....


Che è solo una risposta parziale, OP vuole vedere il log in caso di errore.
Tensibai,

Non è una risposta parziale a questa domanda. Va bene per uno script di shell, ma inutile per la codifica in ansible .
pulcini

@chicks Penso che potrebbe essere una valida soluzione all'approccio del metodo 'shell' all'interno di ansible (che non conosco molto)
Tensibai,

-2

Tee sarà uno strumento molto semplice per la registrazione, è possibile fare riferimento al seguente comando.

eric@eric-MacBookPro:~$ ansible -m ping all | tee > /tmp/ansible.log
eric@eric-MacBookPro:~$ cat /tmp/ansible.log 
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

2
1. Ciò influisce sull'intera corsa, non solo su un'attività. 2. Non ha senso eseguire il piping attraverso tee se hai intenzione di reindirizzare il suo stdout su un file; non è così che usi il comando. 3. Se si stesse usando tee correttamente, avrebbe comunque inviato tutto lo spam alla console, cosa che OP non vuole.
Boicottaggio SE per Monica Cellio,
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.