Ansible playbook shell de sortie

je voudrais surveiller rapidement certains hôtes en utilisant des commandes comme ps, dstat, etc en utilisant ansible-playbook. ansible commande en elle-même est tout à fait ce que je veux, par exemple j'utilise:

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

et bien imprime toutes les mst sortie 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 me demande de garder un tas de scripts shell autour de chaque tâche qui n'est pas très "possible" donc je l'ai mis dans un playbook:

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

et l'exécuter avec -vv, mais la sortie montre baiscally le contenu du dictionnaire et les nouvelles lignes ne sont pas imprimées en tant que telles, de sorte que cela résulte en un désordre illisible comme ceci:

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 1920x1200n
.... 

j'ai aussi essayé d'ajouter register: var et a 'debug' tâche pour afficher {{ var.stdout }} mais le résultat est évidemment le même.

y a-t-il un moyen d'obtenir une sortie joliment formatée à partir d'une commande stdout/stderr lorsqu'elle est exécutée via un playbook? Je peux penser à un certain nombre de moyens possibles (format de sortie en utilisant sed? rediriger la sortie vers un fichier sur l'hôte obtenir ce fichier et d'écho à l'écran?), mais avec ma connaissance limitée de la coquille / possible, il me faudrait un jour pour l'essayer.

39
demandé sur stijn 2013-12-13 14:01:05

7 réponses

debug module pourrait utiliser un peu d'amour, mais pour le moment le meilleur que vous pouvez 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 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"
    ]
}
57
répondu Strahinja Kustudic 2014-07-18 21:43:50

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: Docs concernant ps.stdout_lines sont abordés ici: (chapitre "variables du registre").

14
répondu leucos 2016-04-21 14:39:54

en développant sur ce que leucos a dit dans sa réponse, vous pouvez également imprimer l'information avec l'humble D'Ansible debug module:

- 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
répondu geerlingguy 2014-03-08 03:06:39

Si vous avez besoin d'un statut de sortie, Ansible fournit un moyen de le faire via rappel des plugins.

Exemple. C'est une très bonne option si vous avez besoin d'un statut de sortie 100% précis.

Si non, vous pouvez toujours utiliser le Module De Débogage standard pour ce cas d'utilisation.

Cheers

2
répondu Francis 2016-01-17 07:33:42

j'ai trouvé en utilisant le minimumstdout_callback avec ansible-playbook a donné des résultats similaires à l'utilisation ad-hoc ansible.

dans votre ansible.cfg (notez que je suis sur OS X alors modifiez le callback_plugins chemin d'accès à la fonction de votre installation)

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

Ainsi qu'une ansible-playbook tâche 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 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

2
répondu Jason S 2017-04-07 09:01:52

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

Tâches avec STDOUT en aura une section:

STDOUT:

What ever was in STDOUT
0
répondu Adam Miller 2018-03-09 15:30:33

peut-être pas pertinent si vous cherchez à faire ceci seulement en utilisant ansible. Mais il est beaucoup plus facile pour moi d'avoir une fonction dans mon .bash_profile et puis exécutez _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=
    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
}

E. G.

$ _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 qu'elle l'est. Vous devez le mettre à jour de façon appropriée.

-1
répondu Kashyap 2015-03-27 18:05:19