Başka bir listenin bir parçası olan bir dict öğesinde saklanan bir listenin üstesinden gelmeye çalışıyorum. Benim Taktik kitabı şöyle görünür: Hazırlanabilir çoklu iç içe döngüler
---
- 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
Şimdi ben listeler üzerinde yineleme yığın olarak am, yanıtlayıcı 'gerçek iç içe desteklemek için değil gibi görünüyor, ama iç içe geçmiş iki döngüler için sadece birkaç önceden tanımlanmış yapılar olarak.
i gibi bir şey (çalışmıyor) gerekir:
vars:
restart_services:
domainname: [["mailhost", "postfix"]]
tasks:
- name: Debug
debug: var=restart_services[item.item.0.domain]
with_items: copied_key.results
:
with_subelements:
- copied_key.results
- item.domain
- restart
Zaten bir yedekli liste kullanmaya çalıştı:
with_subelements:
- copied_key.results
- item.domain.restart
ya da (alt öğeler için yanlış sözdizimi)
Gördüğünüz gibi item.item
ile çirkin olmaya başlıyor.
O
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
gibi bir şey gerekir yoksa olmaya ihtiyacı yoksa listeleri bile item.hostname
yerine tuples (aslında listeler) üzerinden yineleme edebilmek için.
with_subelements
gibi önceden oluşturulmuş filtreleri kullanmak yerine yuvaları olan döngüler belirtmenin bir yolu olması gerçekten çok iyi olur.
Ben '' çalıştı with_nested'' ve karmaşık item.item.item zincirlerle benzer garip sonuçlar aldık (belki aradaki endeksleri) sorunu açmadan önce. Sorun, iç içe geçmiş listelerden oluşan bir liste ile çalışmakta ve içilen listelerin gerçekten yuvalanmış listeleri desteklemediğini, ancak en yaygın yuvalama (karma katmanları kullanarak iki katman, ...) için yalnızca birkaç uygulaması olduğunu, ancak keyfi yerleştirme desteğinin olmadığını fark ettim. Cevabınızı henüz test etmedim, şu anda problemi farklı bir şekilde çözdüğümden (sesini çaldıktan sonra bir şeyler kopyalamak için harici bir betik kullanarak). – allo
Buradaki üç katman kopyada değil, yeniden başlatılacak bölümde yer almalı: etki alanında etki alanı için: domain.hosts'taki ana makine için: host.services'te hizmet için: hizmeti yeniden başlat '. Benim sorunumdaki örnek problemlerden kaçınmak için zaten biraz düzleşmiş, ama bunu saf bir şekilde yapabilecektim. Harici komut dosyalarından başka olasılıklar muhtemelen iki oyun kitabı kullanmak ya da daha kolay iç içe geçme ve/veya sadece mevcut kullanım alanını çözme olanağı veren, sesli olarak özel filtreler yazmak olacaktır. – allo