Назад | Перейти на главную страницу

Получите полный список зон Route53 с Ansible

В 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 пункт учебного пособия, если вы найдете это опрятнее.)

Я бы предпочел, чтобы был цикл, который мог бы закончиться сам по себе, вместо того, чтобы пользователю приходилось редактировать исходный код, чтобы исправить его, если список становится слишком большим.