ansible: comment itérer sur tous enregistré des résultats?
Le suivant playbook:
---
- name: Check if log directory exists - Step 1
stat: path="{{ wl_base }}/{{ item.0.name }}/{{ wl_dom }}/servers/{{ item.1 }}/logs" get_md5=no
register: log_dir
with_subelements:
- wl_instances
- servers
- name: Check if log directory exists - Step 2
fail: msg="Log directory does not exists or it is not a symlink."
failed_when: >
log_dir.results[0].stat.islnk is not defined
or log_dir.results[0].stat.islnk != true
or log_dir.results[0].stat.lnk_source != "{{ wl_base }}/logs/{{ wl_dom }}/{{ item.1 }}"
with_subelements:
- wl_instances
- servers
c'est à l'aide de la suite de vars:
---
wl_instances:
- name: aservers
servers:
- AdminServer
- name: mservers
servers:
- "{{ ansible_hostname }}"
la deuxième tâche n'utilise actuellement que l'un des deux résultats possibles (results[0]
).
Ma question est: comment pourrais-je effectuer une itération sur tous les articles disponibles stockées dans log_dir.results
?
Un exemple de sortie debug:hostvars[inventory_hostname]
suit:
"log_dir": {
"changed": false,
"msg": "All items completed",
"results": [
{
"changed": false,
"invocation": {
"module_args": "path=\"/path/to/servers/aservers/domain/AdminServer/logs\" get_md5=no",
"module_name": "stat"
},
"item": [
{
"name": "aservers"
},
"AdminServer"
],
"stat": {
...
"lnk_source": "/path/to/logs/domain/AdminServer",
...
}
},
{
"changed": false,
"invocation": {
"module_args": "path=\"/path/to/servers/mservers/domain/servers/some_hostname/logs\" get_md5=no",
"module_name": "stat"
},
"item": [
{
"name": "mservers"
},
"some_hostname"
],
"stat": {
...
"lnk_source": "/path/to/logs/domain/some_hostname",
...
- Avez-vous trouvé une solution?
- Pas pour l'itération, je suis passé à une structure de données adaptée pour un
with_dict
itération. - Trouvé une solution qui a fonctionné pour moi, posté ci-dessous.
Vous devez vous connecter pour publier un commentaire.
En boucle sur les résultats dans un tableau (dénoté par le []), serait fait comme
ou si c'est un dictionnaire qui contient une liste, comme dans ce cas
remarque, cela peut aussi être écrite
dans votre tâche
Plus d'informations et des exemples sont disponibles dans http://docs.ansible.com/playbooks_loops.html#standard-loops.
La chose principale ici est que vous êtes désireux d'accéder à une partie seulement de l'enregistrés variable.
fail: ... when: ...
au lieu defail: ... failed_when:
Ma sortie de débogage:
Trouvé la solution pour un problème similaire, comme suit:
À l'aide de la
dkim_key.results
et une liste d'itérer et de vérifier ensuite l'encontre de cette liste avecitem.stat.exists
. Enfin d'obtenir la réelleitem
viaitem.item