web-dev-qa-db-ja.com

AnsibleでRoute53ゾーンの完全なリストを取得する

route53_info module は、Route 53ホストゾーンのリストを取得する機能を提供します。ただし、一度に100しか得られません。 (max_itemsを100より大きい値に設定しても、100アイテムしか提供されません。)結果が切り捨てられた場合、IsTruncatedは結果のtrueに設定され、NextMarker IDが提供され、次のゾーンのバッチのリクエストに使用できます。

ただし、すべてのゾーンを確実に取得するためにループする方法がわかりません。タスクの結果を見ることができると思われる唯一のループ構造はuntilですが、最後の実行から得られたデータのみを登録するようであり、再実行されていないようです引数の変数を展開するため、反復ごとに更新されたnext_markerを提供する方法はありません。

すべてのゾーンを確実に取得する唯一の方法は、ゾーンの最大数を事前に把握し、タスクの適切な数のインスタンスを手動で一覧表示して、それぞれの出力を個別に登録することです。別の方法はありますか?

1
wfaulk

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句に移動できます。)

リストが大きくなりすぎた場合に修正するためにユーザーがソースコードを編集する必要があるのではなく、実際にそれ自体で終了する可能性のあるループがあったほうがいいです。

1
wfaulk