Comment voir la sortie standard des commandes ansible?

165

Comment voir stdout pour les commandes ansible-playbook? -v ne montre que la sortie ansible, pas les commandes individuelles. Ce serait formidable si je pouvais trouver le moyen de le faire immédiatement. Par conséquent, si quelque chose échoue ou est suspendu, je peux voir pourquoi.

par exemple

- name: print to stdout
  action: command echo "hello"

serait imprimer

TASK: [print variable] ******************************************************** 

hello
QuinnBaetz
la source

Réponses:

165

Je pense que vous pouvez enregistrer le résultat dans une variable, puis imprimer avec le débogage.

- name: print to stdout
  command: echo "hello"
  register: hello

- debug: msg="{{ hello.stdout }}"

- debug: msg="{{ hello.stderr }}"
bfschott
la source
26
De plus, vous pouvez déboguer une variable directement avec - debug: var=hello. Parfois, cela est plus utile pour la sortie multiligne ou la sortie du module Ansible (plutôt que command/ shellsortie).
geerlingguy
4
J'ai eu du mal à obtenir une sortie Java en utilisant cela. Le correctif est de rediriger toute la sortie de Java vers la sortie standard:shell: java -version 2>&1
Matthias Braun
20
c'est bien mieux rien, mais vous n'obtenez le message stdout qu'une fois la commande terminée. J'avais un problème où ansible semblerait pendre. La raison était que j’utilisais le mauvais nom d’utilisateur pour une commande rsync, qui spoulait la demande de mot de passe interactive, qui venait juste d’être suspendue. Le débogage était très difficile - mais si je pouvais voir stdout en temps réel, j'aurais immédiatement réalisé ce que j'avais mal fait. J'adorerais cette fonctionnalité, si possible.
Michael B
10
Bien que cela fonctionne, cela signifie que ansible rend le débogage très difficile. Imaginons que la première tâche ne se termine jamais (peut-être attende-t-elle bêtement les entrées de l'utilisateur) ... l'utilisateur ne le saura jamais! De plus, le registermodule, ou quoi que ce soit, ne produit pas d'objets avec la stdoutou la stderrvariable définie .... il est donc vraiment dommage que nous n'obtenions pas la sortie par défaut: |
vlad-ardelean
96

Au lieu de stdout, je suggérerais d'utiliser stdout_lines . Pour une sortie multiligne, c'est beaucoup mieux, par exemple

- hosts: all
  tasks:
    - name: Run ls.sh and output "ls /"
      script: ls.sh
      register: out

    - debug: var=out.stdout_lines

donne

TASK: [debug var=out.stdout_lines] ******************************************** 
ok: [local] => {
    "var": {
        "out.stdout_lines": [
            "total 61", 
            "lrwxrwxrwx   1 root root     7 Feb 15  2015 bin -> usr/bin", 
            "drwxr-xr-x   6 root root  1024 Aug 24 22:08 boot", 
            "drwxr-xr-x  22 root root  3580 Sep  8 18:41 dev",  
            [...] 
            "drwxr-xr-x   9 root root  4096 Aug 25 19:14 usr", 
            "drwxr-xr-x  13 root root  4096 Feb 25  2015 var"
        ]
    }
}

En ce qui concerne la sortie en temps réel à des fins de débogage, un rapport de bogue fermé, https://github.com/ansible/ansible/issues/3887&language=54672569 , explique les raisons pour lesquelles cela est impossible et ne sera pas implémenté.

Mars
la source
16
+1 pour lier le bug "sortie en temps réel".
Ntc2
Si je veux envoyer out.stdout_lines (en tant que corps de la tâche de courrier Ansible), comment puis-je l'envoyer afin qu'il ne ressemble PAS à ceci lorsque le courrier électronique est reçu? [total 61 ', u'lrwxrwxrwx 1 racine racine 7 févr. 2015 bin -> usr / bin', u'drwxr-xr-x 6 racine racine 1024 août 24 22:08 démarrage ', u' .... . '] Je veux que ça ressemble à ceci, comme on le voit sur le terminal
Chris F
fatal: [127.0.0.1]: ECHEC! => {"reason": "Erreur de syntaxe lors du chargement de YAML. \ n n'a pas trouvé le <début du document> attendu \ \ n \ nL'erreur semble être dans ... problème de syntaxe. \ n \ nLa ligne incriminée semble être: \ n \ n \ n- name: lancez ls.sh et affichez \ "ls / \" \ n ^ ici \ n "}
Nate
20

J'ai trouvé que l'utilisation du minimum stdout_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 callback_pluginschemin 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 comme celle-ci

---
- hosts: example
  tasks:
   - name: Say hi
     command: echo "hi ..."

Donne une sortie comme celle-ci, comme le ferait une commande ad-hoc

example | SUCCESS | rc=0 >>
hi ...

J'utilise ansible-playbook 2.2.1.0

Jason S
la source
Beau plugin de rappel, un post-traitement simple peut extraire uniquement la sortie standard.
RichVel