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

如何在Ansible中获取嵌套字典的键与子键并传入Jinja2模板

Ansible 嵌套字典遍历:获取键与子键并生成输出

问题场景

现有如下YAML数据结构:

blob:
  TEST:
    dest:
      barry: {y.y.y.y: null}
      john: {x.x.x.x: null}
    source: [1.2.3.4]

需要实现类似以下Python逻辑的遍历,获取blob的键(如TEST)以及对应dest下的子键(如barry、john),用于生成文件名或其他输出:

for i in blob.keys():
    for s in blob[i]['dest'].keys():
        # 使用i和s生成内容

期望输出示例:

key: TEST  subkey: john
key: TEST  subkey: barry

原尝试方法的问题

你用with_subelements的写法无法生效,因为with_subelements要求第一个参数的列表元素中,必须包含第二个参数指定的嵌套字段(即每个元素是带有对应子字段的字典)。但你传入的blob.keys()是字符串列表,不存在blob[item.0]['dest'].keys()这样的嵌套结构,Ansible无法解析。

正确实现方式

方法1:结合with_dict与内层loop

逻辑清晰,先遍历blob的键值对,再内层遍历对应dest的子键:

- name: 遍历嵌套字典的键与子键
  debug:
    msg: "key: {{ outer_item.key }} subkey: {{ inner_item }}"
  loop: "{{ outer_item.value.dest.keys() }}"
  loop_control:
    loop_var: inner_item
  with_dict: "{{ blob }}"

方法2:使用dict2items与subelements过滤器

通过dict2items将字典转换为键值对列表,再用subelements提取嵌套的dest子键,更贴合现代Ansible写法:

- name: 遍历嵌套字典的键与子键
  debug:
    msg: "key: {{ item.0.key }} subkey: {{ item.1.key }}"
  loop: "{{ blob | dict2items | subelements('value.dest', skip_missing=True) }}"

注:skip_missing=True用于避免部分blob项无dest字段时出错,可按需调整。

输出结果

两种方法都会生成符合预期的内容:

ok: [localhost] => (item=john) => {
    "msg": "key: TEST  subkey: john"
}
ok: [localhost] => (item=barry) => {
    "msg": "key: TEST  subkey: barry"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:32:12