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.
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"
]
}
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") .
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
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
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
ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook /tmp/foo.yml -vvv
Aufgaben mit STDOUT haben dann einen Abschnitt:
STDOUT:
What ever was in STDOUT