这route53_info
模块提供获取 Route 53 托管区域列表的功能。但是,它每次只能获取 100 个区域。(设置max_items
为大于 100 的任何值仍然只能提供 100 个项目。)如果结果被截断,则在结果中IsTruncated
设置为,并提供一个 ID,然后可以使用该 ID 来请求下一批区域。true
NextMarker
但是,我没有看到一种循环方法来确保我得到所有的区域。似乎能够查看任务结果的唯一循环构造是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
剧本的条款中。)
我宁愿有一个可以自行结束的循环,而不是在列表变得太大时让用户编辑源代码来修复它。