gpt4 book ai didi

ansible - 使用 Ansible 在 Route 53 中列出 100 多条记录

转载 作者:行者123 更新时间:2023-12-02 02:47:42 27 4
gpt4 key购买 nike

我目前正在使用 route53_facts项目中的模块。我在一个托管区域中有 250 个记录集。我很难列出该区域中的所有记录集。 Route 53 API 通过返回 的页面来工作。最多 100 条记录 一次。为了检索下一页,您必须通过 下一条记录名称 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 调试输出中看到的那样, 开始记录名称:反复 :
"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 从 Route 53 的某个区域返回所有记录。我想我已经被 Ansible 的循环行为缠住了。谢谢!

最佳答案

用“据我所知:”警告这一点

要回答您的问题,实际上似乎 until:register:不要以与 when: 相同的方式进行交互和 register:做。我最好的解释是until:行为类似于数据库事务:它回滚 register:如果条件为假,则赋值,这意味着当 until: 的主体再次尝试任务,它使用与第一次相同的参数。唯一保留 until: 的东西阻止无限循环是retries:值(value)。

因此,在您的具体情况下,我认为这将完成这项工作:

- 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:是 hack 因为 loop: ( with_* 是语法糖)需要一个要迭代的项目列表,但考虑到返回的响应没有 NextRecordName将导致 when:失败,跳过它们,使(在你的情况下)3到10个项目几乎立即解决。

然后你只需要从现在的 list中提取实际的响应数据。的 route53_facts:回复,并将它们粘贴到第一个以获得完整列表。

说了这么多,我现在确信 route53_facts: (以及将迭代的负担插入剧本的任何其他 AWS 模块)行为是 错误 .模块调用者已经有一个 max_items:对他们可用,但这是一个实现细节,任何值都不能大于某个随机分页截止值。

关于ansible - 使用 Ansible 在 Route 53 中列出 100 多条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53652222/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com