2016-03-24 17 views
3

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.

cevap

1

"with_nested" kullanmayı denediniz mi? Ansible documentation’u kontrol edebilirsiniz.

Bu işe yarayabilecek:

- name: Copy Private Key 
    register: copied_key 
    copy: src=/etc/letsencrypt/live/{{ item[0].domain }}/privkey.pem dest="{{ item[1] }}/" 
    with_nested: 
    - copy_certs 
    - copy_certs.copy_to 
+0

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

+0

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

İlgili konular