別のリストの一部である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
のようなプリマイドフィルタを使用する代わりに、ネストするループを指定する方法があるのは本当に良いことです。
は私が ''試さwith_nested''と複雑item.item.item鎖と似奇妙な結果を得た(多分間で指数)問題を開く前に。問題はネストされたリストのリストを使っていて、実際にネストされたリストを実際にサポートしていないのですが、最も一般的なネスト(2つのレイヤー、ハッシュを使って...)ではいくつかの実装があります。私はあなたの答えをまだテストしていません。私は現在、問題を別の方法で解決しています。 – allo
3つの層はコピーにありませんが、再起動部分では、ドメイン内のドメイン:domain.hostsのホスト:host.servicesのサービス:restartサービスをネストする必要があります。私の質問の例は、すでに問題を回避するために少し平坦化されていますが、これを純粋な不可能なもので行うのは依然として厄介です。外部スクリプトよりも可能性が高いのはおそらく、2つのプレイブックを使用しているか、またはよりネスティングを許可したり、現在のユースケースを解決したりするためのカスタムフィルタを記述することです。 – allo