使用 Ansible 获取 Route53 区域的完整列表

使用 Ansible 获取 Route53 区域的完整列表

route53_info模块提供获取 Route 53 托管区域列表的功能。但是,它每次只能获取 100 个区域。(设置max_items为大于 100 的任何值仍然只能提供 100 个项目。)如果结果被截断,则在结果中IsTruncated设置为,并提供一个 ID,然后可以使用该 ID 来请求下一批区域。trueNextMarker

但是,我没有看到一种循环方法来确保我得到所有的区域。似乎能够查看任务结果的唯一循环构造是until,但它似乎只记录上次运行产生的数据,而且似乎它不会重新扩展其参数中的变量,因此无法为next_marker每次迭代提供更新。

我认为“确保”获取所有区域的唯一方法是事先知道最大区域数,然后手动列出适当数量的任务实例,并单独注册每个实例的输出。还有其他方法吗?

答案1

基于接受的答案非常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)) }}"

(如果您发现这样更整洁,set_fact可以将其移至vars剧本的条款中。)

我宁愿有一个可以自行结束的循环,而不是在列表变得太大时让用户编辑源代码来修复它。

相关内容