gpt4 book ai didi

ansible - 我可以在 Ansible play 中使用 Jinja2 `map` 过滤器从对象数组中获取值吗?

转载 作者:行者123 更新时间:2023-12-02 11:21:58 26 4
gpt4 key购买 nike

我有一个剧本,用于创建一些 EC2 实例,然后用它们做一些事情。相关部分大致如下:

- name: create ec2 instances
ec2:
id: '{{ item.name }}'
instance_type: '{{ item.type }}'
register: ec2
with_items: '{{ my_instance_defs }}'
- name: wait for SSH
wait_for:
host: '{{ item.instances[0].private_ip }}'
port: 22
with_items: '{{ ec2.results }}'

这按预期工作,但我对 item.instances[0].private_ip 表达式不是特别满意,部分原因是它在播放摘要中显示了非常大的对象。我希望 with_items 部分只是一个 IP 地址数组,而不是一个内部包含对象数组的对象数组。在Python中,我会做类似的事情:

ips = [r['instances'][0]['private_ip'] for r in ec2['results']]

然后我会在第二个任务中使用 with_items: '{{ ips }}'

有没有办法可以在戏剧的 YAML 中使用 J2 过滤器做同样的事情?看起来像http://docs.ansible.com/ansible/playbooks_filters.html#extracting-values-from-containers可能会有所帮助,但我认为前提是我有一组键/索引/其他内容。

最佳答案

map在这里过滤一下你的 friend 。

类似这样的事情:

with_items: "{{ ec2.results | map(attribute='instances') | map('first') | map(attribute='private_ip') | list }}"

上面的代码未经测试。
您可能需要先尝试使用 debug 并逐渐添加 map 以获得所需的结果。
不要忘记添加 |列表位于末尾以使您的 map 可读。

关于ansible - 我可以在 Ansible play 中使用 Jinja2 `map` 过滤器从对象数组中获取值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41286160/

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