Wie kann ich die Anzahl der verfügbaren Befehle sehen?

165

Wie sehe ich stdout für ansible-playbook Befehle? -v zeigt nur eine sichtbare Ausgabe an, nicht die einzelnen Befehle. Es wäre großartig, wenn ich sofort herausfinden könnte, wie das geht. Wenn also etwas ausfällt oder hängt, kann ich nachvollziehen, warum.

z.B

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

würde drucken

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

hello
QuinnBaetz
quelle

Antworten:

165

Ich denke, Sie können das Ergebnis in einer Variablen registrieren und dann mit Debug drucken.

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

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

- debug: msg="{{ hello.stderr }}"
bfschott
quelle
26
Zusätzlich können Sie eine Variable direkt mit debuggen - debug: var=hello. Manchmal ist dies für die Ausgabe in mehreren Zeilen oder für die Ausgabe in Ansible-Modulen (anstelle von command/ shelloutput) hilfreicher .
Geerlingguy
4
Ich hatte Probleme damit, Java-Ausgabe zu bekommen. Der Fix besteht darin, die gesamte Ausgabe von Java auf stdout umzuleiten:shell: java -version 2>&1
Matthias Braun
20
Das ist viel besser nichts, aber Sie erhalten die stdout-Nachricht erst, nachdem der Befehl erfolgreich ausgeführt wurde. Ich hatte ein Problem, bei dem es so aussah, als würde Ansible hängen. Der Grund dafür war, dass ich den falschen Benutzernamen für einen rsync-Befehl verwendet habe, der die interaktive Kennwortanforderung gespoolt hat, die sich gerade gesperrt hat. Es war sehr schwer zu debuggen - aber wenn ich stdout in Echtzeit sehen könnte, hätte ich sofort gemerkt, was ich falsch gemacht hatte. Ich würde diese Funktionalität, wenn möglich, LIEBEN.
Michael B
10
Dies funktioniert zwar, bedeutet aber, dass das Debuggen durch Ansible sehr schwierig wird. Stellen wir uns vor, die erste Aufgabe wird nie beendet (vielleicht wartet sie dumm auf Benutzereingaben) ... der Benutzer würde es nie erfahren! Darüber hinaus erzeugt das registerModul oder was auch immer es ist, keine Objekte, für die die Variable stdoutoder stderrfestgelegt ist. Es ist also wirklich schlimm, dass wir nicht nur die Ausgabe standardmäßig erhalten: |
Vlad-Ardelean
96

Anstelle von stdout würde ich stdout_lines vorschlagen . Bei mehrzeiliger Ausgabe ist dies viel besser, z

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

    - debug: var=out.stdout_lines

gibt

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

Bezüglich der Echtzeitausgabe für Debugging-Zwecke gibt es einen geschlossenen Fehlerbericht https://github.com/ansible/ansible/issues/3887#issuecomment-54672569 , in dem die Gründe erläutert werden, warum dies nicht möglich ist und nicht implementiert wird.

Mars
quelle
16
+1 für die Verknüpfung des Fehlers "Echtzeitausgabe".
NTC2
Wenn ich out.stdout_lines (als Textkörper der Ansible-Mail-Aufgabe) senden möchte, wie kann ich es senden, damit es beim Empfang von E-Mails NICHT so aussieht? [u'total 61 ', u'lrwxrwxrwx 1 root root 7 Feb 15 2015 bin -> usr / bin', u'drwxr-xr-x 6 root root 1024 Aug 24 22:08 boot ', u' .... . '] Ich möchte, dass es so aussieht, wie auf dem Terminal zu sehen
Chris F
tödlich: [127.0.0.1]: FEHLGESCHLAGEN! => {"reason": "Syntaxfehler beim Laden von YAML. \ n hat den erwarteten <Dokumentstart> nicht gefunden \ n \ nDer Fehler scheint in ... zu liegen. \ n \ nDie fehlerhafte Zeile scheint zu lauten: \ n \ n \ n- name: Führen Sie ls.sh aus und geben Sie \ "ls / \" \ n ^ here \ n "} aus
Nate
20

Ich habe festgestellt, dass die Verwendung von Minimal stdout_callback mit Ansible-Playbook eine ähnliche Ausgabe wie die Verwendung von Ad-hoc-Ansible liefert.

In Ihrer ansible.cfg (Beachten Sie, dass ich unter OS X bin, und ändern Sie den callback_pluginsPfad entsprechend Ihrer Installation.)

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

So dass eine Aufgabe wie diese

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

Gibt eine Ausgabe wie die eines Ad-hoc-Befehls aus

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

Ich verwende Ansible-Playbook 2.2.1.0

Jason S
quelle
Nettes Callback-Plugin, einfache Nachbearbeitung kann nur die Standardausgabe extrahieren.
RichVel