route53_info
module は、Route 53ホストゾーンのリストを取得する機能を提供します。ただし、一度に100しか得られません。 (max_items
を100より大きい値に設定しても、100アイテムしか提供されません。)結果が切り捨てられた場合、IsTruncated
は結果のtrue
に設定され、NextMarker
IDが提供され、次のゾーンのバッチのリクエストに使用できます。
ただし、すべてのゾーンを確実に取得するためにループする方法がわかりません。タスクの結果を見ることができると思われる唯一のループ構造はuntil
ですが、最後の実行から得られたデータのみを登録するようであり、再実行されていないようです引数の変数を展開するため、反復ごとに更新されたnext_marker
を提供する方法はありません。
すべてのゾーンを確実に取得する唯一の方法は、ゾーンの最大数を事前に把握し、タスクの適切な数のインスタンスを手動で一覧表示して、それぞれの出力を個別に登録することです。別の方法はありますか?
StackOverflowでvery同様の質問に対する受け入れられた回答 に基づいて、これを考え出すことができました単一のループタスクに収集されるデータ、およびすべてのゾーンが収集されたことを確認するための追加のチェック:
- name: List all hosted zones (prime loop)
set_fact:
zone_answer:
NextMarker: ""
IsTruncated: true
- name: List all hosted zones
route53_facts:
query: hosted_zone
next_marker: "{{ zone_answer.NextMarker }}"
when: zone_answer.IsTruncated
loop: "{{ range(10)|list }}"
register: zone_answer
- name: List all hosted zones (check for completion)
fail:
msg: "Did not get all zones; increase loop range in task above"
when: (zone_answer.results | rejectattr('skipped', 'defined') | list | last).IsTruncated
- name: List all hosted zones (compile data)
set_fact:
hosted_zones: "{{ (zone_answer.results | selectattr('HostedZones', 'defined') | map(attribute='HostedZones') | list | flatten(levels=1)) }}"
(set_fact
は、より整頓されていれば、ハンドブックのvars
句に移動できます。)
リストが大きくなりすぎた場合に修正するためにユーザーがソースコードを編集する必要があるのではなく、実際にそれ自体で終了する可能性のあるループがあったほうがいいです。