Wie protokolliere ich die Ausgabe von Aufgaben in einer Datei?

9

Eine meiner ansible Aufgaben importiert eine Oracle-Datenbank mit impdp.

Dies erzeugt eine Menge Ausgabe an die Konsole, also habe ich eingestellt no_log: True.

Wenn dies jedoch fehlschlägt, möchte ich das Protokoll sehen!

Wie kann ich dieses bestimmte Aufgabenprotokoll in einer Datei und nicht in der Konsole erstellen?

opticyclisch
quelle
Sie verwenden das Befehlsmodul?
Boykott SE für Monica Cellio
Eine Idee [eher ein Hack] wäre, die Protokolle in eine externe Datei zu schreiben und danach eine Aufgabe zu haben, die die failed_whenBedingung nutzt , und die Protokolldatei zu entfernen, falls die vorherige. Aufgabe war erfolgreich :)
Dawny33
Warum können Sie die Konsolenausgabe bei erfolgreichen Läufen überhaupt sehen? Ich habe weder eine Konfiguration für gesehen, noch habe ich gedacht, dass es möglich ist, stdout während einer erfolgreichen Taskausführung anzuzeigen. Es sollte nur [ok: Hostname] angezeigt werden. Wenn jedoch ein Fehler erkannt wird, wird die Ausgabe an die Ansible-Steuerkonsole (und alle definierten Ansible-Protokolle) ausgegeben. Würde es Ihnen etwas ausmachen, die Konfiguration zu teilen, die Ihnen während eines regulären erfolgreichen Laufs den großen Standard gibt?
Hvindin
@hvindin -vvvNach dem ansible-playbookBefehl zum Abrufen ausführlicher Protokolle eingeben .
Dawny33
1
Das Registrieren einer Variablen scheint der beste logische Schritt zu sein. In meinem Kommentar zu Ihrer Antwort finden Sie meine Meinung dazu, was mit den Ausgaben von ansible ausgelösten Befehlen zu tun ist.
Hvindin

Antworten:

4

[Meinen Kommentar in eine Antwort umwandeln]

Eine Möglichkeit besteht darin, die Protokolle in eine externe Datei zu schreiben und anschließend eine Aufgabe zu erstellen, die die Bedingung failed_when verwendet, und die Protokolldatei zu entfernen, wenn die vorherige Aufgabe erfolgreich war.

So etwas sollte dir helfen.

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

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

Hinweis: Dies ist möglicherweise nicht der beste Weg, um Ihr Problem zu lösen. Dies war jedoch ein Hack, der mir bei der Protokollierung und Überwachung half.

Dawny33
quelle
2
Ich würde noch einen Schritt weiter gehen und sagen, Sie könnten Ihren Befehl weiterhin in stdout / stderr schreiben und ihn dann einfach als Antwort auf einen Fehler ausgeben. Als Beispiel in Ihrem obigen Beispiel, wenn Sie die Ausführung im Falle eines Fehlers anhalten wollten, verwenden Sie eine Fehleraufgabe, um nur das in PyScript registrierte stdout und stderr auszugeben, wenn rc! = 0 eine ganzheitlichere Lösung zu sein scheint. Wenn Sie integrierte Ansibles-Mechanismen verwenden und beispielsweise eine Ansible-Protokollierung auf einem Steuerungsserver eingerichtet haben, protokolliert dieser Steuerungsserver den Fehler im Ansible-Protokoll. Was ich denke, wäre der richtige Ort dafür
hvindin
3

Ich denke, alles, was Sie tun müssen, ist, die Ausgabe jedes benötigten Befehls zu registrieren (in einer Variablen speichern) und dann einfach die Variable in einer Datei abzulegen. Auf diese Weise können Sie es später überprüfen.

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

Dann 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 }} 

Das Beispiel, das ich benutze, ist von hier

13dimitar
quelle
3

Ich habe dies durch Hinzufügen gelöst

ignore_errors: true
register: results

zur no_log-task. Dies macht es möglich, mit der nächsten Aufgabe fortzufahren, selbst wenn die Aufgabe fehlschlägt. Definieren Sie dann für die nächste Aufgabe eine Debug-Aufgabe, die immer fehlschlägt und die registrierte Variable ausgibt, aber nur ausgeführt wird, wenn die vorherige Aufgabe fehlgeschlagen ist:

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

Selbst mit no_log: true wird dadurch die Ausgabe der fehlgeschlagenen Aufgabe ansibel angezeigt. Diese Lösung protokolliert es nicht wie angefordert in einer Datei, sondern erfüllt Ihre Anforderungen, das Protokoll anzuzeigen, wenn es fehlgeschlagen ist. Natürlich können Sie die vollständige ansible Ausgabe in eine Datei umleiten oder verwenden, um dies mit dieser Lösung zu tun Enthält auch das Protokoll der fehlgeschlagenen Aufgabe.

Robin Roevens
quelle
2

Was ich mache, wenn ich einen Befehl zum Ausführen habe und das Protokoll nur im Fehlerfall abrufen möchte, ist wie folgt (vorangestellt durch ein Shell-Kommando und wie /bin/sh -c '...'für den Fall, dass der Initiator keinen systemAufruf verwendet oder den Befehl direkt ohne Shell ausführt). ::

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

Dadurch werden Fehler und Standardausgaben in eine Datei umgeleitet und der Inhalt der Datei nur im Fehlerfall angezeigt. Wenn der Befehl sehr ausführlich ist und Sie das Protokoll nicht behalten möchten, wenn es in Ordnung ist, können Sie fortfahren mit:

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

Zitat &&und ||Verwendung von sh manpage :

Das Symbol && (||) bewirkt, dass die folgende Liste nur ausgeführt wird, wenn die vorhergehende Pipeline einen Wert von Null (ungleich Null) zurückgibt.

Dies ist wahrscheinlich nicht die idiomatischste Methode, um es mit ansible zu tun, hat jedoch den Vorteil, dass es mit jedem Konfigurationsmanagementsystem sehr portabel ist und die Möglichkeit bietet, den Befehl stdout anzuzeigen.

Tensibai
quelle
0

Unter der Annahme, dass ansible Fehler ordnungsgemäß an stderr auslöst, können Sie die Ausgabe von Fehlern in jedem Programm mithilfe der Ausgabeweitleitung in eine Datei erfassen:

some command 2> error.log

Ich glaube jedoch nicht, dass dies der Fall ist.

Stattdessen sollten Sie sich wahrscheinlich auf dieses Handbuch beziehen, um zu entscheiden, wann Fehler auftreten. Http://docs.ansible.com/ansible/playbooks_error_handling.html und dann Ihre Ausgabe nach Zeichenfolgen durchsuchen, die auf einen Fehler hinweisen, bevor Sie sie in eine Datei ausgeben

dh.

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

yosefrow
quelle
-2

Ich denke, was Sie suchen, könnte zu einfach sein, stdout und street umzuleiten, um es abzulegen.

In der Regel ein Befehl &> logfile.log

oder eine Variante ....

sparq
quelle
Dies ist nur eine teilweise Antwort. OP möchte das Protokoll im Fehlerfall sehen.
Tensibai
Ich weiß nicht, dass dies auch nur eine teilweise Antwort auf diese Frage ist. Es ist in Ordnung für ein Shell-Skript, aber nutzlos für die Codierung in Ansible .
Küken
@chicks Ich denke, es könnte eine gültige Problemumgehung für einen 'Shell'-Methodenansatz innerhalb von Ansible sein (was ich nicht viel weiß)
Tensibai
-2

Tee ist ein sehr einfaches Werkzeug für die Protokollierung. Sie können den folgenden Befehl verwenden.

eric@eric-MacBookPro:~$ ansible -m ping all | tee > /tmp/ansible.log
eric@eric-MacBookPro:~$ cat /tmp/ansible.log 
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
Eric Zhang
quelle
2
1. Dies betrifft den gesamten Lauf und nicht nur eine Aufgabe. 2. Es macht keinen Sinn, durch das T-Stück zu leiten, wenn Sie dessen Standard in eine Datei umleiten möchten. So verwenden Sie den Befehl nicht. 3. Wenn Sie tee richtig verwenden, wird immer noch der gesamte Spam an die Konsole ausgegeben, was OP nicht möchte.
Boykott SE für Monica Cellio