Ansible如何对对象中的location字段进行唯一值循环遍历?
Ansible 遍历location唯一值的简便方法
直接用Ansible内置的map和unique过滤器组合就能实现,不需要额外生成新对象,具体方案如下:
1. 仅遍历唯一的location值
如果只需要获取去重后的地点列表并循环,用下面的写法:
- name: 循环遍历唯一地点 debug: msg: "当前处理地点: {{ item }}" loop: "{{ myobj | map(attribute='location') | unique }}"
map(attribute='location'):从myobj的每个元素中提取location字段,生成包含所有地点的列表(含重复值)unique:对上述列表去重,得到仅含唯一值的地点列表
执行后会分别输出denver和paris两个地点,不会重复处理。
2. 按location分组并关联用户信息
如果需要同时获取每个唯一地点对应的用户列表,可以用groupby过滤器:
- name: 按地点分组遍历 debug: msg: "地点 {{ item.0 }} 对应的用户: {{ item.1 | map(attribute='name') | join(', ') }}" loop: "{{ myobj | groupby('location') }}"
groupby('location'):将myobj按location字段分组,返回的每个元素是(地点字符串, 该地点下的用户对象列表)的元组- 后续可以通过
map(attribute='name')提取该地点下的用户名,再用join拼接成易读的字符串
内容的提问来源于stack exchange,提问作者Daniel Kupfer
相关产品推荐
相关产品推荐

