Mehrere geschachtelte Schleifen in ansible
Ich versuche eine Schleife über eine Liste, die gespeichert ist in ein dict, das ist Teil einer anderen Liste. mein playbook sieht wie folgt aus:
---
- 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
Nun bin ich Stapel bei der Iteration über die Listen, wie ansible scheint nicht zu unterstützen, echte Verschachtelung, aber nur wenige vordefinierte Strukturen für zwei geschachtelte Schleifen.
ich würde sowas braucht (funktioniert nicht):
with_subelements:
- copied_key.results
- item.domain.restart
oder (falsche syntax für Unterelemente):
with_subelements:
- copied_key.results
- item.domain
- restart
Ich bereits versucht, eine redundante Liste:
vars:
restart_services:
domainname: [["mailhost", "postfix"]]
tasks:
- name: Debug
debug: var=restart_services[item.item.0.domain]
with_items: copied_key.results
wie Sie sehen, es bereits beginnt, hässlich mit item.item
.
Bräuchte es so etwas wie
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
oder wenn Sie nicht brauchen, um Listen zu können, Durchlaufen Sie noch item.hostname
anstelle von Tupeln (eigentlich Listen).
Wäre es wirklich gut, eine Möglichkeit zu haben, geben Sie Schleifen mit der Verschachtelung statt mit vorgefertigten filtern wie with_subelements
.
InformationsquelleAutor allo | 2016-03-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie versucht, mit "with_nested"? Sie können sich die Ansible Dokumentation.
Dies funktionieren könnte:
with_nested
und bekam ähnlich seltsame Ergebnisse mit komplizierten Sache.Element.Element-Ketten (vielleicht werden die Indizes zwischen) vor dem öffnen der Ausgabe. Das problem ist das arbeiten mit einer Liste von verschachtelten Listen, und ich erkannte, dass ansible nicht wirklich Unterstützung von verschachtelten Listen, aber nur wenige Implementierungen für die meisten gängigen nesting (zwei Ebenen, mit hashes, ...), aber keine Unterstützung für beliebige Schachtelung. Habe ich nicht getestet, Ihre Antwort noch, da ich momentan das problem, anders (über ein externes Skript zu kopieren Zeug nach dem ausführen ansible).Die drei Schichten gibt es nicht an der Kopie, aber beim restart Teil, die noch bis zum nest: für die Domäne in Domänen: für Hosts in der Domäne.Gastgeber: service host.Dienste: Dienst neu starten`. Das Beispiel in meiner Frage schon ein bisschen abgeflacht, um die Probleme vermeiden, aber es ist immer noch böse zu tun, das mit reinem ansible. Andere Möglichkeiten als externe Skripts würden sich wahrscheinlich mit zwei playbooks oder das schreiben von benutzerdefinierten filtern für ansible, die es erlauben, mehr verschachteln und/oder einfach nur lösen die aktuellen Anwendungsfall.
InformationsquelleAutor calvinmclean