gpt4 book ai didi

ansible - 从 Ansible 中的 map 列表中提取属性列表的正确方法

转载 作者:行者123 更新时间:2023-12-03 22:11:25 24 4
gpt4 key购买 nike

我正在寻找一种不难看的方法来从 Ansible 中的 map 列表中提取特定值的列表。我可以找到一些方法来做到这一点,例如:here,但我所看到的一切都非常丑陋,感觉应该有一种方法可以更清楚地让 future 阅读它的人做什么。我可以写一个过滤器,但感觉这应该是不必要的,因为这必须相对定期地出现。

我在 Ansible 中有一个像这样的数据结构:

interfaces:
- name: eth0
subnet: 192.168.2
netmask: 255.255.255.0
static_dhcp_hosts:
- {name: "hosta", mac: "00:01:02:03:04:05", ip: "192.168.2.20"}
- name: eth1
subnet: 192.168.5
netmask: 255.255.255.0
static_dhcp_hosts:
- {name: "hostb", mac: "00:02:03:04:05:06", ip: "192.168.5.20"}
- {name: "hostc", mac: "00:03:04:05:06:07", ip: "192.168.5.21"}

我想获得一个以空格分隔的接口(interface)名称列表,所以
eth0 eth1

显然这只是示例数据,实际的顶级列表对于一台主机有 10 个元素。我知道我可以使用连接过滤器从接口(interface)列表中获取我想要的字符串以及如何执行此操作。

任何人都可以提出一个很好的方法来制作列表,这对 future 的维护者来说是可读的(代码/配置应该尽可能地自我记录(而不是进一步))?

我想做类似的事情
{% for interface in interfaces %}{{ interface.name }} {% endfor %}

或者
" ".join([ interface['name'] for interface in interfaces ])

在 Python 中。

但是,AFAIK,你不能,或者认为在角色的 task/main.yml 中使用这样的 jinja2 循环是不好的做法,而且,正如我所说,感觉不应该使用自定义为此过滤。

(这个角色不仅仅是配置一个 DHCP 服务器,所以请不要只建议一个预先存在的角色来做这件事,这不会解决我的问题)。

任何不丑陋的方法都将不胜感激,人们也会确认没有不丑陋的方法。

我正在使用 Ansible 2.3,但我仍然对答案感兴趣,即使它们仅适用于更高版本。

编辑:

以下:
"{{ internal_interfaces | items2dict(key_name='name',value_name='name') | list | join(\" \") }}"

有效,并且是我能想到的最丑陋的。它从列表中创建一个字典,键和值都来自列表中字典的名称属性,然后将该字典转换为一个列表,该列表仅给出一个键列表。如果有人能想到任何东西,我仍然想要一些不那么迟钝和丑陋的东西,或者让任何 Ansible 大师在他们认为没有更好的东西时回复。

最佳答案

映射和加入是您所需要的:

- set_fact:
interface_names: "{{ interfaces | map(attribute='name') | join(' ') }}"

关于ansible - 从 Ansible 中的 map 列表中提取属性列表的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54091449/

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