Перечисление более 100 записей в Route 53 с использованием Ansible - PullRequest
0 голосов
/ 06 декабря 2018

В настоящее время я использую модуль route53_facts в проекте.У меня 250 наборов записей в одной размещенной зоне.У меня проблемы с перечислением всех наборов записей в этой зоне.API Route 53 работает, возвращая страницы максимум 100 записей за раз.Чтобы получить следующую страницу, необходимо передать значение ответа NextRecordName в start_record_name модуля * route53_facts: (довольно просто).

Проблема, с которой я столкнулсяопределенно становится Ansible, чтобы сделать это.Предположительно, это можно сделать с помощью цикла, например, в псевдокоде:

start
get 100 records
do until response does not contain NextRecordName:
    get 100 records (start_record_name=NextRecordName)
end

В Ansible я написал следующую задачу, чтобы сделать это:

- block:
  - name: List record sets in a given hosted zone
    route53_facts:
      query: record_sets
      hosted_zone_id: "/hostedzone/ZZZ1111112222"
      max_items: 100
      start_record_name: "{{ record_sets.NextRecordName | default(omit) }}"
    register: record_sets
    until: record_sets.NextRecordName is not defined
  when: "'{{ hosted_zone['Name'] }}' == 'test.example.com.'"

... однако этоне работает, как ожидалось.Вместо того, чтобы непрерывно листать ответы до тех пор, пока не останется больше записей, он многократно возвращает первые 100 записей («первая страница»).

Как я вижу из вывода отладочной информации Ansible, start_record_name: многократно null :

"attempts": 2,
"changed": false,
"invocation": {
    "module_args": {
        "aws_access_key": null,
        "aws_secret_key": null,
        "change_id": null,
        "delegation_set_id": null,
        "dns_name": null,
        "ec2_url": null,
        "health_check_id": null,
        "health_check_method": "list",
        "hosted_zone_id": "/hostedzone/ZZZ1111112222",
        "hosted_zone_method": "list",
        "max_items": "100",
        "next_marker": null,
        "profile": null,
        "query": "record_sets",
        "region": null,
        "resource_id": null,
        "security_token": null,
        "start_record_name": null,
        "type": null,
        "validate_certs": true
    }
},

... я думаю, что |по умолчанию (опущено) фильтр всегда выполняется.Другими словами, record_sets.NextRecordName никогда не инициализируется на этом этапе задачи.

Я надеюсь, что кто-нибудь может помочь мне получить Ansible для возврата всех записей из зоны на маршруте 53Я думаю, что я запутался в зацикленном поведении Ansible.Спасибо!

1 Ответ

0 голосов
/ 07 декабря 2018

Обозначьте это как "насколько я могу сказать:"

Чтобы ответить на ваш вопрос, на самом деле кажется, что until: и register: не взаимодействуют так же, какwhen: и register: до.Лучшее объяснение, которое у меня есть, состоит в том, что until: ведет себя как транзакция базы данных: он откатывает присваивание register:, если условное условие ложно, что означает, что при повторном запуске тела задачи until: используются те же параметрыкак в первый раз.Единственное, что удерживает блок until: от бесконечного цикла, - это значение retries:.

Итак, в вашем конкретном случае, я думаю, это сработает:

- name: initial record_set
  route53_facts:
  # bootstrap so the upcoming "when:" will evaluate correctly
  register: record_facts
- set_fact:
    # capture the initial answer
    records0: '{{ record_facts.ResourceRecordSets }}'
- name: rest of them
  route53_facts:
    start_record_name: '{{ record_facts.NextRecordName }}'
  register: record_facts
  when: record_facts.NextRecordName | default("")
  with_sequence: count=10
- set_fact:
    all_records: >-
      {{ record0 + (record_facts.results | 
           selectattr("ResourceRecordSets", "defined") |
           map(attribute="ResourceRecordSets") | list) }}

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * with_sequence: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1019* - это хак, потому что loop: (для которого with_* является синтетическим сахаром) нужен список элементов, для которых необходимо выполнить итерацию, но, учитывая, что ответы, которые возвращаются без NextRecordName, вызовут when: провал, пропуская их, заставляет (в вашем случае) пункты от 3 до 10 разрешаться почти сразу.

Тогда вам просто нужно извлечь фактические данные ответа из list из route53_facts: ответов.и приклейте их к исходному, чтобы получить полный список.


Сказав все это, я теперь убежден, что route53_facts: (и любой другой модуль AWS, который увеличивает нагрузку на эту итерациюв playbook) поведение ошибка .Вызывающий модуль уже имеет в своем распоряжении max_items:, но это деталь реализации, заключающаяся в том, что любое значение не может быть больше, чем какое-либо случайное обрезание нумерации страниц.

...