Plusieurs boucles imbriquées dans ansible
Je suis en train de boucler sur une liste, qui est stockée dans une dict, qui fait partie d'une autre liste. mon playbook ressemble à ceci:
---
- hosts: all
vars:
copy_certs:
- { domain: 'domainname', copy_to: ['/tmp/foo', '/tmp/bar'], restart: [["mailhost", "postfix"], ["mailhost", "dovecot"]] }
- { domain: 'domainname2', copy_to: ['/tmp/foo2', '/tmp/bar2'], restart: [["mail.lxc", "postfix"]] }
tasks:
[...]
- name: Copy Private Key
register: copied_key
copy: src=/etc/letsencrypt/live/{{ item.0.domain }}/privkey.pem dest="{{ item.1 }}/"
with_subelements:
- copy_certs
- copy_to
- name: Debug (here should be delegates to "item.restart.NUM.0" to restart "item.restart.NUM.1" with_subelements: ...)
debug: var=item
with_items: copied_key.results
Maintenant, je suis pile à l'itération sur les listes, comme ansible ne semble pas réel de soutien de nidification, mais seulement quelques structures prédéfinies pour les deux boucles imbriquées.
j'aurais besoin de quelque chose comme (ne fonctionne pas):
with_subelements:
- copied_key.results
- item.domain.restart
ou (mauvaise syntaxe pour les sous-éléments):
with_subelements:
- copied_key.results
- item.domain
- restart
J'ai déjà essayé d'utiliser une liste redondante:
vars:
restart_services:
domainname: [["mailhost", "postfix"]]
tasks:
- name: Debug
debug: var=restart_services[item.item.0.domain]
with_items: copied_key.results
comme vous le voyez, il commence déjà d'être moche avec item.item
.
Il aurait besoin de quelque chose comme
register: [to_restart for to_restart in item['restart']] as services_to_rstart
- debug: var=item # item.0 = hostname item.1 = servicename
with_items: services_to_restart
ou si elle n'a pas besoin d'être des listes pour être en mesure d'effectuer une itération sur elle même item.hostname
au lieu de n-uplets (en fait des listes).
Il serait vraiment bien d'avoir un moyen de spécifier des boucles à la nidification, au lieu de l'utilisation de filtres prédéfinis comme with_subelements
.
OriginalL'auteur allo | 2016-03-24
Vous devez vous connecter pour publier un commentaire.
Avez-vous essayé d'utiliser "with_nested"? Vous pouvez consulter le Ansible documentation.
Cela peut fonctionner:
with_nested
similaires et a obtenu des résultats bizarres compliquée avec l'élément.de l'élément.élément de chaînes (peut-être des indices entre les deux) avant l'ouverture de la question. Le problème, c'est de travailler avec une liste de listes imbriquées et j'ai réalisé que ansible n'a pas vraiment de soutien des listes imbriquées, mais a juste quelques implémentations pour la plupart des communes de nidification (deux couches, à l'aide de tables de hachage, ...) mais pas de support pour arbitraire de nidification. Je n'ai pas testé votre réponse pour l'instant, comme je l'ai actuellement résolu le problème de la même façon (à l'aide d'un script externe pour copier des trucs après l'exécution de l'ansible).Les trois couches il n'y a pas à le copier, mais au redémarrage, partie, qui doit nid: pour de domaine dans les domaines: de l'hôte dans le domaine.hôtes: pour le service dans l'hôte.services: redémarrer le service`. L'exemple dans ma question, c'est déjà un peu aplatie pour éviter les problèmes, mais c'est toujours désagréable de le faire avec de la pure ansible. D'autres possibilités de scripts externes serait probablement à l'aide de deux tablettes playbook ou écrire des filtres personnalisés pour ansible, qui permettent à plus de nidification et/ou simplement de résoudre le cas d'utilisation.
OriginalL'auteur calvinmclean