wake-up-neo.com

Ansible Playbook Shell-Ausgabe

Ich möchte einige Hosts mit Befehlen wie ps, dstat usw. mit Ansible-Playbook schnell überwachen. Der ansible-Befehl selbst macht perfekt, was ich möchte, zum Beispiel würde ich Folgendes verwenden:

ansible -m Shell -a "ps -eo pcpu,user,args | sort -r -k1 | head -n5"

und es druckt schön alle std-Ausgaben für jeden Host wie folgt:

localhost | success | rc=0 >>
0.0 root     /sbin/init
0.0 root     [kthreadd]
0.0 root     [ksoftirqd/0]
0.0 root     [migration/0]

otherhost | success | rc=0 >>
0.0 root     /sbin/init
0.0 root     [kthreadd]
0.0 root     [ksoftirqd/0]
0.0 root     [migration/0] 

Allerdings muss ich für jede Aufgabe, die nicht sehr "anpassbar" ist, ein paar Shell-Skripte bereithalten, also lege ich dies in ein Playbook:

---
-
  hosts: all
  gather_facts: no
  tasks:
    - Shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5

und führen Sie es mit -vv aus. Die Ausgabe zeigt jedoch baiscally den Inhalt des Wörterbuchs an, und Zeilenumbrüche werden nicht als solche gedruckt. Dies führt zu einem unlesbaren Durcheinander wie folgt:

changed: [localhost] => {"changed": true, "cmd": "ps -eo pcpu,user,args | sort -r -k1 
head -n5 ", "delta": "0:00:00.015337", "end": "2013-12-13 10:57:25.680708", "rc": 0,
"start": "2013-12-13 10:57:25.665371", "stderr": "", "stdout": "47.3 xxx    Xvnc4 :24
-desktop xxx:24 (xxx) -auth /home/xxx/.Xauthority -geometry 1920x1200\n
.... 

Ich habe auch versucht, register: var und die Task 'debug' hinzuzufügen, um {{ var.stdout }} anzuzeigen, aber das Ergebnis ist natürlich dasselbe.

Gibt es eine Möglichkeit, eine schön formatierte Ausgabe von stdout/stderr eines Befehls zu erhalten, wenn er über ein Playbook ausgeführt wird? Ich kann mir eine Reihe von Möglichkeiten vorstellen (Formatausgabe mit Hilfe von sed? Umleiten der Ausgabe in eine Datei auf dem Host, diese Datei dann zurückholen und auf dem Bildschirm wiedergeben?), Aber bei meinem begrenzten Wissen über die Shell/ansible würde es mich brauchen ein Tag, um es einfach auszuprobieren.

41
stijn

Das debug-Modul könnte wirklich etwas Liebe gebrauchen, aber im Moment können Sie dies am besten tun:

- hosts: all
  gather_facts: no
  tasks:
    - Shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
      register: ps

    - debug: var=ps.stdout_lines

Es gibt eine Ausgabe wie diese:

ok: [Host1] => {
    "ps.stdout_lines": [
        "%CPU USER     COMMAND",
        " 1.0 root     /usr/bin/python",
        " 0.6 root     sshd: [email protected] ",
        " 0.2 root     Java",
        " 0.0 root     sort -r -k1"
    ]
}
ok: [Host2] => {
    "ps.stdout_lines": [
        "%CPU USER     COMMAND",
        " 4.0 root     /usr/bin/python",
        " 0.6 root     sshd: [email protected] ",
        " 0.1 root     Java",
        " 0.0 root     sort -r -k1"
    ]
}
61

Dies kann ein Anfang sein:

- hosts: all
  gather_facts: no
  tasks:
    - Shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
      register: ps

    - local_action: command echo item
      with_items: ps.stdout_lines

HINWEIS: Dokumente zu ps.stdout_lines werden hier behandelt: (Kapitel "Variablen registrieren") .

14
leucos

In Anlehnung an das, was Leukos in seiner Antwort gesagt haben, können Sie Informationen auch mit Ansibles bescheidenem Modul debug drucken:

- hosts: all
  gather_facts: no
  tasks:
    - Shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
      register: ps

    # Print the Shell task's stdout.
    - debug: msg={{ ps.stdout }}

    # Print all contents of the Shell task's output.
    - debug: var=ps
7
geerlingguy

Ich fand die Verwendung von minimalstdout_callback mit Ansible-Playbook ergab eine ähnliche Ausgabe wie bei Ad-hoc-Ansible.

In Ihrer ansible.cfg (Beachten Sie, dass ich mich unter OS X befinde. Ändern Sie daher den callback_plugins-Pfad entsprechend Ihrer Installation.)

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

Damit eine ansible-playbook-Aufgabe wie Ihre

---
-
  hosts: example
  gather_facts: no
  tasks:
    - Shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5

Gibt eine Ausgabe wie diese aus, wie es ein Ad-hoc-Befehl tun würde

example | SUCCESS | rc=0 >>
%CPU USER     COMMAND
 0.2 root     sshd: [email protected]/3
 0.1 root     /usr/sbin/CROND -n
 0.0 root     [xfs-reclaim/vda]
 0.0 root     [xfs_mru_cache]

Ich verwende das Ansible-Playbook 2.2.1.0

2
Jason S

Wenn Sie einen bestimmten Exit-Status benötigen, bietet Ansible über callback plugins eine Möglichkeit dazu. 

Beispiel . Dies ist eine sehr gute Option, wenn Sie einen 100% igen Exit-Status benötigen.

Wenn nicht, können Sie immer das Debug Module verwenden. Dies ist der Standard für diese Anwendungsfälle.

Prost 

2
Francis

ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook /tmp/foo.yml -vvv

Aufgaben mit STDOUT haben dann einen Abschnitt:

STDOUT:

What ever was in STDOUT
0
Adam Miller