Ansible遍历嵌套列表成员并保留所属团队名称的最优方法
你当前选用的subelements过滤器就是这个场景的最优实现,它是Ansible官方为「遍历父级列表的同时迭代每个父元素的嵌套子列表、且保留父级上下文」设计的标准方案。
你现在的代码问题出在变量取值不对:subelements过滤器返回的每一个循环项item是二元数组:
item.0是当前迭代的父级host完整对象,可以从这里拿到团队名称item.0.team.nameitem.1是当前迭代的team.members里的单个成员对象,成员账号、密码都存在这里
最简正确写法
- name: 'create users' nislab.ctfd.ctfd_user: url: '{{ url }}' ctfd_api_key: '{{ ctfd_api_key }}' name: '{{ item.1.name }}' password: '{{ item.1.password }}' state: '{{ state }}' # 如需关联团队直接取父级属性即可 # team: '{{ item.0.team.name }}' loop: "{{ hosts | subelements('team.members') }}"
高可读性优化写法
如果后续要频繁引用父级属性,可以用loop_control给循环项起别名降低理解成本:
- name: 'create users' nislab.ctfd.ctfd_user: url: '{{ url }}' ctfd_api_key: '{{ ctfd_api_key }}' name: '{{ member.name }}' password: '{{ member.password }}' team: '{{ host_info.team.name }}' state: '{{ state }}' loop: "{{ hosts | subelements('team.members') }}" loop_control: loop_var: item_pair vars: host_info: "{{ item_pair.0 }}" member: "{{ item_pair.1 }}"
内容的提问来源于stack exchange,提问作者In0cenT
相关产品推荐
相关产品推荐

