2016-03-24 3 views
3

Я пытаюсь перебрать список, который хранится в dict, который является частью другого списка. мой сборник пьесы выглядят следующим образом:Несколько вложенных циклов в ansible

--- 
- 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 

Теперь я складываю в итерация списков, так как анзибль кажется, не поддерживать реальную вложенности, но всего лишь несколько заранее определенные структур для двух вложенных циклов.

я бы нужно что-то вроде (не работает):

with_subelements: 
    - copied_key.results 
    - item.domain.restart 

или (неверный синтаксис подэлемента):

with_subelements: 
    - copied_key.results 
    - item.domain 
    - restart 

Я уже пытался использовать резервный список:

vars: 
    restart_services: 
    domainname: [["mailhost", "postfix"]] 
tasks: 
    - name: Debug 
    debug: var=restart_services[item.item.0.domain] 
    with_items: copied_key.results 

, как вы видите, он уже начинает быть уродливым с item.item.

Это нужно было что-то вроде

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 

или, если он не должен быть списки, чтобы иметь возможность перебрать даже item.hostname вместо кортежей (на самом деле списки).

Было бы здорово иметь способ указать петли с гнездом вместо использования готовых фильтров, таких как with_subelements.

ответ

1

Вы пытались использовать «with_nested»? Вы можете проверить Ansible documentation.

Это может работать:

- 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

Я попытался '' with_nested'' и получил похожие странные результаты со сложным item.item.item цепей (возможно, индексами между ними) перед открытием этого вопроса. Проблема заключается в работе со списком вложенных списков, и я понял, что ansible действительно не поддерживает вложенные списки, но имеет несколько реализаций для наиболее распространенного вложенности (два слоя, используя хеши, ...), но не поддерживает произвольное вложение. Я еще не тестировал ваш ответ, так как в настоящее время я решил проблему по-другому (используя внешний скрипт для копирования материала после запуска функции). – allo

+0

Три слоя там не на копии, но на части перезапуска, которая должна быть вложенной: «для домена в доменах: для хоста в домене. Хосты: для службы в host.services: restart service''. Пример в моем вопросе уже немного сплющен, чтобы избежать проблем, но это все же противно делать это с чистой возможностью. Другие возможности, чем внешние скрипты, вероятно, будут использовать две playbooks или писать настраиваемые фильтры для доступа, которые позволяют больше вложенности и/или просто решать текущую usecase. – allo

Смежные вопросы