web-dev-qa-db-fra.com

Livre de lecture Ansible Shell

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.

41
stijn

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"
    ]
}
61
Strahinja Kustudic

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') .

14
leucos

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
7
geerlingguy

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

2
Jason S

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é 

2
Francis

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
0
Adam Miller