You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible循环中如何正确访问嵌套变量的指定属性值?

原写法的问题

你的写法存在两处核心用法错误,无法正常读取vorname值:

  • with_subelements对输入数据格式有强要求:传入的顶层参数必须是列表类型,子元素路径指向的属性也必须是列表类型。但你定义的kommunen是字典结构(顶层以weimar这类字符串作为键,admins层也以用户名作为键,均不是列表),直接传入会触发类型匹配错误。
  • 即使数据格式符合要求,with_subelements遍历返回的item固定为长度2的数组:item[0]是父级列表的单个元素,item[1]是子元素列表中的单个子项,直接输出item[0]只能拿到父级城市的全量信息,取不到嵌套在admins下的vorname字段。
正确实现方案

根据是否调整原始YAML数据结构,有两种可行实现:

方案1:不改动原始YAML结构

如果要保留现有两层字典的YAML格式,只需要读取vorname这类管理员自身属性的话,直接通过json_query提取所有管理员对象为列表后遍历即可,写法最简洁:

- name: "Account Daten testen"
  tags: testusers
  debug:
    msg: "管理员名:{{ item.vorname }},姓:{{ item.name }},邮箱:{{ item.mail }}"
  loop: "{{ kommunen | json_query('*[].admins.*[]') }}"

如果需要同时关联管理员所属的城市信息,更推荐使用方案2调整数据结构,避免复杂的过滤器嵌套语法增加维护成本。

方案2:调整YAML为列表结构,适配with_subelements原生用法

with_subelements本身为嵌套列表场景设计,如果将原有字典结构调整为列表格式,后续遍历逻辑会更符合插件设计预期,调整后的YAML示例:

kommunen:
  - city_name: weimar
    tld: stadt-weimar.de
    desc: Kommune Weimar
    admins:
      - username: fritzfriemel
        vorname: Fritz
        name: Friemel
        mail: f.friemel@stadt-weimar.de
      - username: frankfrokel
        vorname: Frank
        name: Frokel
        mail: f.frokel@stadt-weimar.de

调整后对应任务可以直接使用with_subelements遍历:

- name: "Account Daten testen"
  tags: testusers
  debug:
    msg: "所属城市:{{ item[0].city_name }},管理员名:{{ item[1].vorname }}"
  with_subelements:
    - "{{ kommunen }}"
    - admins

内容的提问来源于stack exchange,提问作者sebbe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:15:43