Je voudrais surveiller rapidement certains hôtes en utilisant des commandes telles que ps, dstat, etc. en utilisant ansible-playbook. La commande ansible
elle-même fait parfaitement ce que je veux, par exemple, j'utiliserais:
ansible -m Shell -a "ps -eo pcpu,user,args | sort -r -k1 | head -n5"
et il affiche bien toutes les sorties std pour chaque hôte comme ceci:
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]
Cependant, cela nécessite que je garde un tas de scripts Shell pour chaque tâche qui n'est pas très "ansible", alors je l'ai mis dans un livre de jeu:
---
-
hosts: all
gather_facts: no
tasks:
- Shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
et exécutez-le avec -vv
, mais la sortie affiche le contenu du dictionnaire et les nouvelles lignes ne sont pas imprimées en tant que telles, ce qui entraîne un désordre illisible comme celui-ci:
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
....
J'ai aussi essayé d'ajouter register: var
et la tâche de 'débogage' pour afficher {{ var.stdout }}
mais le résultat est bien sûr le même.
Existe-t-il un moyen d'obtenir une sortie correctement formatée à partir de la commande stdout/stderr d'une commande lorsqu'elle est exécutée via un livre de lecture? Je peux penser à un certain nombre de manières possibles (le formatage en utilisant sed? Redirection vers un fichier sur l'hôte, puis récupérer ce fichier et l'afficher à l'écran?), Mais avec ma connaissance limitée du shell, cela me prend une journée pour l'essayer.
Le module debug
pourrait vraiment utiliser un peu d'amour, mais pour le moment, le mieux que vous puissiez faire,
- hosts: all
gather_facts: no
tasks:
- Shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
register: ps
- debug: var=ps.stdout_lines
Cela donne une sortie comme ceci:
ok: [Host1] => {
"ps.stdout_lines": [
"%CPU USER COMMAND",
" 1.0 root /usr/bin/python",
" 0.6 root sshd: root@notty ",
" 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: root@notty ",
" 0.1 root Java",
" 0.0 root sort -r -k1"
]
}
C'est un début peut être:
- 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
NOTE: Les documents concernant ps.stdout_lines
sont traités ici: (chapitre 'Enregistrer les variables') .
En développant ce que leucos a dit dans sa réponse, vous pouvez également imprimer des informations avec le module humble debug
d'Ansible
- 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
J'ai trouvé que le minimalstdout_callback
avec ansible-playbook produisait un résultat similaire à celui utilisé avec ad hoc.
Dans votre ansible.cfg (notez que je suis sous OS X alors modifiez le chemin callback_plugins
en fonction de votre installation)
stdout_callback = minimal
callback_plugins = /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ansible/plugins/callback
Pour qu'une tâche ansible-playbook
comme la vôtre
---
-
hosts: example
gather_facts: no
tasks:
- Shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5
Donne une sortie comme celle-ci, comme le ferait une commande ad-hoc
example | SUCCESS | rc=0 >>
%CPU USER COMMAND
0.2 root sshd: root@pts/3
0.1 root /usr/sbin/CROND -n
0.0 root [xfs-reclaim/vda]
0.0 root [xfs_mru_cache]
J'utilise ansible-playbook 2.2.1.0
Si vous avez besoin d'un statut de sortie spécifique, Ansible vous propose de le faire via callback plugins.
Exemple . C'est une très bonne option si vous avez besoin d'un statut de sortie précis à 100%.
Sinon, vous pouvez toujours utiliser le module Debug , qui est le standard _ pour ces cas d'utilisation.
À votre santé
ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook /tmp/foo.yml -vvv
Les tâches avec STDOUT auront alors une section:
STDOUT:
What ever was in STDOUT