Dis 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 pour sûr que c'était réussi.
Où/comment puis-je voir le "Hello World" en écho/imprimé par mon script sur l'hôte distant (MyTestHost)? Ou le code retour/sortie du script?
Ma recherche montre qu’il serait possible d’écrire un plugin pour intercepter les rappels d’exécution de modules ou quelque chose du genre et écrire un fichier journal. Je préférerais ne pas perdre mon temps avec cela.
Par exemple. quelque chose comme la sortie standard ci-dessous (notez que je cours ansible et pas 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"
}
$
Si vous passez l'indicateur -v
à ansible-playbook sur la ligne de commande, vous verrez les options 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 recherchera le fichier de configuration à plusieurs endroits:
ansible.cfg
dans le répertoire en cours où vous avez exécuté ansible-playbook
~/.ansible.cfg
/etc/ansible/ansible.cfg
La tâche de script playbook générera stdout
comme la commande non-playbook, elle doit simplement être enregistrée dans une variable à l'aide de register
. Une fois que nous avons cela, le module debug peut imprimer dans le flux de sortie du livre de lecture.
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`."
}
Il existe également un autre moyen de générer un fichier journal.
Avant d'exécuter ansible-playbook
, exé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 = True
Pour vérifier le fichier journal généré.
moins $ ANSIBLE_LOG_PATH
En utilisant des plugins de rappel, vous pouvez avoir la sortie standard de vos commandes sous une forme lisible avec la lecture: Gist: human_log.py
Editer 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
Une aide en ligne de commande Ansible, telle que ansible-playbook --help
, montre comment augmenter la verbosité de sortie en définissant le mode commenté (-v) sur plus de verbosité (-vvv) ou sur la verbosité de débogage de connexion (-vvvv). Cela devrait vous donner quelques-uns des détails que vous recherchez dans stdout, que vous pouvez ensuite enregistrer.
Plugins officiels
Vous pouvez utiliser les plugins de rappel output . Par exemple, à partir de Ansible 2.4, vous pouvez utiliser le plugin debug output callback:
# In ansible.cfg:
[defaults]
stdout_callback = debug
(Alternativement, lancez export ANSIBLE_STDOUT_CALLBACK=debug
avant de lancer votre playbook)
Important: vous devez exécuter ansible-playbook
avec l'option -v
(--verbose
) pour voir l'effet. Avec stdout_callback = debug
défini, 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.
Outre le module debug
, il existe d’autres modules 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 plugin human_log
. Il y a quelques versions: