В route53_info
модуль предоставляет возможность получить список зон, размещенных на Route 53. Однако за раз он будет получать только 100. (Настройка max_items
значение больше 100 по-прежнему предоставляет только 100 элементов.) Если результаты усечены, IsTruncated
установлен на true
в результатах, а NextMarker
Предоставляется идентификатор, который затем можно использовать для запроса следующего пакета зон.
Однако я не вижу способа зацикливаться, чтобы гарантировать, что я получу все зоны. Единственная конструкция цикла, которая, кажется, может смотреть на результаты задачи, - это until
, но, похоже, он регистрирует только данные, полученные в результате последнего запуска, и кажется, что он не повторно расширяет переменные в своих аргументах, поэтому нет возможности предоставить обновленный next_marker
для каждой итерации.
Единственный способ «гарантировать» получение всех зон - это заранее знать максимальное количество зон и просто указать соответствующее количество экземпляров задачи, перечисленных вручную, регистрируя вывод каждой из них отдельно. Есть другой способ?
На основе принятый ответ на очень аналогичный вопрос на StackOverflow, Я смог придумать это, которое добавляет сворачивание сбора данных в одну зацикленную задачу и некоторую дополнительную проверку, чтобы убедиться, что все зоны были собраны:
- 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)) }}"
(The set_fact
можно переместить в vars
пункт учебного пособия, если вы найдете это опрятнее.)
Я бы предпочел, чтобы был цикл, который мог бы закончиться сам по себе, вместо того, чтобы пользователю приходилось редактировать исходный код, чтобы исправить его, если список становится слишком большим.