Sortie de shell du playbook Ansible

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 imprime bien toute la sortie 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 exige que je garde un tas de scripts shell pour chaque tâche qui n’est pas très «accessible», alors je mets ceci dans un manuel:

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

et lancez-le avec -vv , mais le résultat montre que le contenu du dictionnaire et les nouvelles lignes ne sont pas imprimés en tant que tels.

 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 également essayé d’append register: var et la tâche ‘debug’ pour afficher {{ var.stdout }} mais le résultat est bien sûr le même.

Existe-t-il un moyen d’obtenir une sortie bien formatée à partir de la commande stdout / stderr d’une commande lorsqu’elle est exécutée via un livret de jeu? Je peux penser à un certain nombre de façons possibles (formater la sortie en utilisant sed? Rediriger la sortie vers le fichier sur l’hôte puis récupérer ce fichier et le faire écho à l’écran?) Mais avec ma connaissance limitée du shell / ansible cela me prendrait un jour pour juste l’essayer.

Le module de debug peut vraiment utiliser un peu d’amour, mais pour le moment, le mieux que vous puissiez faire est d’utiliser ceci:

 - hosts: all gather_facts: no tasks: - shell: ps -eo pcpu,user,args | sort -r -k1 | head -n5 register: ps - debug: var=ps.stdout_lines 

Il donne un résultat comme celui-ci:

 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 

REMARQUE: Les documents concernant ps.stdout_lines sont couverts ici: (chapitre “Enregistrer les variables”) .

En élargissant ce que dit leucos dans sa réponse, vous pouvez également imprimer des informations avec le modeste module de debug 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 

Si vous avez besoin d’un statut de sortie spécifique, Ansible fournit un moyen de le faire via les plugins de rappel .

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 de débogage , qui est la norme pour ce cas d’utilisation.

À votre santé

J’ai trouvé que l’utilisation du stdout_callback minimal avec ansible-playbook donnait un résultat similaire à l’utilisation de la réponse ad hoc.

Dans votre ansible.cfg (notez que je suis sur OS X, modifiez le chemin de 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 

Donc, une tâche comme un 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 ceci, comme une commande ad hoc serait

 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

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 

Peut-être pas pertinent si vous cherchez à le faire UNIQUEMENT en utilisant ansible. Mais il est beaucoup plus facile pour moi d’avoir une fonction dans mon .bash_profile , puis d’exécuter _check_machine host1 host2

 function _check_machine() { echo 'hostname,num_physical_procs,cores_per_procs,memory,Gen,RH Release,bios_hp_power_profile,bios_intel_qpi_link_power_management,bios_hp_power_regulator,bios_idle_power_state,bios_memory_speed,' hostlist=$1 for h in `echo $hostlist | sed 's/ /\n/g'`; do echo $h | grep -qE '[a-zA-Z]' [ $? -ne 0 ] && h=plabb$h echo -n $h, ssh root@$h 'grep "^physical id" /proc/cpuinfo | sort -u | wc -l; grep "^cpu cores" /proc/cpuinfo |sort -u | awk "{print \$4}"; awk "{print \$2/1024/1024; exit 0}" /proc/meminfo; /usr/sbin/dmidecode | grep "Product Name"; cat /etc/redhat-release; /etc/facter/bios_facts.sh;' | sed 's/Red at Enterprise Linux Server release //g; s/.*=//g; s/\tProduct Name: ProLiant BL460c //g; s/-//g' | sed 's/Red Hat Enterprise Linux Server release //g; s/.*=//g; s/\tProduct Name: ProLiant BL460c //g; s/-//g' | tr "\n" "," echo '' done } 

Par exemple

 $ _machine_info '10 20 1036' hostname,num_physical_procs,cores_per_procs,memory,Gen,RH Release,bios_hp_power_profile,bios_intel_qpi_link_power_management,bios_hp_power_regulator,bios_idle_power_state,bios_memory_speed, plabb10,2,4,47.1629,G6,5.11 (Tikanga),Maximum_Performance,Disabled,HP_Static_High_Performance_Mode,No_CStates,1333MHz_Maximum, plabb20,2,4,47.1229,G6,6.6 (Santiago),Maximum_Performance,Disabled,HP_Static_High_Performance_Mode,No_CStates,1333MHz_Maximum, plabb1036,2,12,189.12,Gen8,6.6 (Santiago),Custom,Disabled,HP_Static_High_Performance_Mode,No_CStates,1333MHz_Maximum, $ 

Inutile de dire que la fonction ne fonctionnera pas pour vous comme elle est. Vous devez le mettre à jour de manière appropriée.