Comment obtenir les journaux / détails des exécutions du module Ansible-Playbook?

95

Disons que j'exécute ce qui suit.

$ cat test.sh
#!/bin/bash
echo Hello World
exit 0

$ cat Hello.yml
---

- hosts: MyTestHost
  tasks:
  - name: Hello yourself
    script: test.sh


$ ansible-playbook  Hello.yml

PLAY [MyTestHost] ****************************************************************

GATHERING FACTS ***************************************************************
ok: [MyTestHost]

TASK: [Hello yourself] ********************************************************
ok: [MyTestHost]

PLAY RECAP ********************************************************************
MyTestHost                    : ok=2    changed=0    unreachable=0    failed=0

$

Je sais avec certitude que cela a réussi.

Où / comment puis-je voir le "Hello World" renvoyé / imprimé par mon script sur l'hôte distant (MyTestHost)? Ou le code retour / sortie du script?

Mes recherches me montrent qu'il serait possible d'écrire un plugin pour intercepter les rappels d'exécution de module ou quelque chose sur ces lignes et d'écrire un fichier journal. Je préférerais ne pas perdre mon temps avec ça.

Par exemple, quelque chose comme le stdout ci-dessous (notez que j'utilise ansible et non ansible-playbook):

$ ansible plabb54 -i /project/plab/svn/plab-maintenance/ansible/plab_hosts.txt -m script -a ./test.sh
plabb54 | success >> {
    "rc": 0,
    "stderr": "",
    "stdout": "Hello World\n"
}

$
Kashyap
la source

Réponses:

113

Si vous passez l' -vindicateur à ansible-playbook sur la ligne de commande, vous verrez les stdout et stderr pour chaque tâche exécutée:

$ ansible-playbook -v playbook.yaml

Ansible a également un support intégré pour la journalisation. Ajoutez les lignes suivantes à votre fichier de configuration ansible :

[defaults] 
log_path=/path/to/logfile

Ansible cherchera à plusieurs endroits le fichier de configuration:

  • ansible.cfg dans le répertoire actuel où vous avez exécuté ansible-playbook
  • ~/.ansible.cfg
  • /etc/ansible/ansible.cfg
Lorin Hochstein
la source
8
Merci. Juste gourmand: Puis-je démarrer / arrêter dynamiquement la journalisation à partir d'un playbook? Comme set -xet set +xdans un script shell.
Kashyap
@thekashyap Je ne pense pas que ce soit actuellement possible.
Lorin Hochstein
9
Vous pouvez utiliser l' no_log: Trueindicateur pour empêcher une commande ou un playbook de se connecter, mais c'est aussi précis que possible, je crois.
Ade Miller du
4
Pourriez - vous s'il vous plaît décrire comment puis-je mettre logrotateà log_pathpour que chaque ansiblecourse a un fichier différent (avec la commande / PlayBook inclus dans le fichier)?
mouche en polystyrène
J'avais besoin de trois vs pour obtenir stdout et stderr
riche
24

La tâche de script de playbook sera générée stdoutcomme la commande non-playbook, il suffit de l'enregistrer dans une variable à l'aide de register. Une fois que nous avons cela, le module de débogage peut imprimer sur le flux de sortie du playbook.

tasks:
- name: Hello yourself
  script: test.sh
  register: hello

- name: Debug hello
  debug: var=hello

- name: Debug hello.stdout as part of a string
  debug: "msg=The script's stdout was `{{ hello.stdout }}`."

La sortie devrait ressembler à ceci:

TASK: [Hello yourself] ******************************************************** 
changed: [MyTestHost]

TASK: [Debug hello] *********************************************************** 
ok: [MyTestHost] => {
    "hello": {
        "changed": true, 
        "invocation": {
            "module_args": "test.sh", 
            "module_name": "script"
        }, 
        "rc": 0, 
        "stderr": "", 
        "stdout": "Hello World\r\n", 
        "stdout_lines": [
            "Hello World"
        ]
    }
}

TASK: [Debug hello.stdout as part of a string] ******************************** 
ok: [MyTestHost] => {
    "msg": "The script's stdout was `Hello World\r\n`."
}
joemaller
la source
mais Bonjour toi-même tâche n'ont pas donné de stdout
Saurabh Chandra Patel
C'est ma méthode préférée. Devenez bon à utiliser les valeurs des variables enregistrées dans les instructions de débogage et le monde est à vous.
Joshua K le
14

Il existe également un autre moyen de générer un fichier journal.

Avant d'exécuter, ansible-playbookexécutez les commandes suivantes pour activer la journalisation:

  • Spécifiez l'emplacement du fichier journal.

    export ANSIBLE_LOG_PATH = ~ / ansible.log

  • Activer le débogage

    export ANSIBLE_DEBUG = Vrai

  • Pour vérifier ce fichier journal généré.

    moins $ ANSIBLE_LOG_PATH

Kamlesh
la source
1
ANSIBLE_DEBUG est en quelque sorte distinct de la spécification d'un fichier journal. C'est même distinct de la sélection de verbosité! C'est toujours très bon à appeler - le débogage vous donnera des messages de débogage orientés développeur, à un niveau de verbosité absolument extrême. Bon d'avoir autour.
AlanSE
4

Plugins officiels

Vous pouvez utiliser les plugins de rappel de sortie . Par exemple, à partir d'Ansible 2.4, vous pouvez utiliser le plugin de rappel de sortie de débogage :

# In ansible.cfg:
[defaults]
stdout_callback = debug

(Alternativement, exécutez export ANSIBLE_STDOUT_CALLBACK=debugavant d'exécuter votre playbook)

Important: vous devez exécuter ansible-playbookavec l' option -v( --verbose) pour voir l'effet. Avec stdout_callback = debugset, la sortie devrait maintenant ressembler à ceci:

TASK [Say Hello] ********************************
changed: [192.168.1.2] => {
    "changed": true,
    "rc": 0
}

STDOUT:


Hello!



STDERR:

Shared connection to 192.168.1.2 closed.

Il existe d'autres modules en plus du debugmodule si vous souhaitez que la sortie soit formatée différemment. Il y a json, yaml, unixy, dense, minimal, etc. ( liste complète ).

Par exemple, avec stdout_callback = yaml, la sortie ressemblera à ceci:

TASK [Say Hello] **********************************
changed: [192.168.1.2] => changed=true 
  rc: 0
  stderr: |-
    Shared connection to 192.168.1.2 closed.
  stderr_lines:
  - Shared connection to 192.168.1.2 closed.
  stdout: |2-

    Hello!
  stdout_lines: <omitted>

Plugins tiers

Si aucun des plugins officiels n'est satisfaisant, vous pouvez essayer le human_logplugin. Il existe plusieurs versions:

Flux
la source
3

En utilisant des plugins de rappel, vous pouvez avoir la sortie stdout de vos commandes sous une forme lisible avec le play: gist: human_log.py

Modifier par exemple la sortie:

 _____________________________________
< TASK: common | install apt packages >
 -------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


changed: [10.76.71.167] => (item=htop,vim-tiny,curl,git,unzip,update-motd,ssh-askpass,gcc,python-dev,libxml2,libxml2-dev,libxslt-dev,python-lxml,python-pip)

stdout:
Reading package lists...
Building dependency tree...
Reading state information...
libxslt1-dev is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 24 not upgraded.


stderr:

start:
2015-03-27 17:12:22.132237

end:
2015-03-27 17:12:22.136859
J0hnG4lt
la source
1

Aide en ligne de commande Ansible, telle que ansible-playbook --helpmontre comment augmenter la verbosité de sortie en définissant le mode verbeux (-v) sur plus de verbosité (-vvv) ou sur la verbosité de débogage de connexion (-vvvv). Cela devrait vous donner certains des détails que vous recherchez dans stdout, que vous pouvez ensuite enregistrer.

Zach Weg
la source