2016-03-24 11 views
3

別のリストの一部であるdictに格納されているリストをループしようとしています。複数のネストされたループがある可能性があります

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

ansibleが本当の営巣が、2つの入れ子のループのためのわずか数あらかじめ定義された構造をサポートしていないようですと今私は、リストを反復処理でスタックしています:私の脚本は、次のようになります。

私のような何か(動作しない)必要があります:私はすでに冗長リストを使用しようとした

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鎖と似奇妙な結果を得た(多分間で指数)問題を開く前に。問題はネストされたリストのリストを使っていて、実際にネストされたリストを実際にサポートしていないのですが、最も一般的なネスト(2つのレイヤー、ハッシュを使って...)ではいくつかの実装があります。私はあなたの答えをまだテストしていません。私は現在、問題を別の方法で解決しています。 – allo

+0

3つの層はコピーにありませんが、再起動部分では、ドメイン内のドメイン:domain.hostsのホスト:host.servicesのサービス:restartサービスをネストする必要があります。私の質問の例は、すでに問題を回避するために少し平坦化されていますが、これを純粋な不可能なもので行うのは依然として厄介です。外部スクリプトよりも可能性が高いのはおそらく、2つのプレイブックを使用しているか、またはよりネスティングを許可したり、現在のユースケースを解決したりするためのカスタムフィルタを記述することです。 – allo

関連する問題