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

Ansible:将字典合并到嵌套字典内指定列表项中

解决Ansible中合并字典到列表指定项的问题

我通过import_playbook调用准备playbook获取了service_secrets字典,需要将其合并到product.dependencies中Source为"S3"的列表项内,但使用combine()时错误地新增了列表项而非合并到目标项。

方法一:使用map遍历合并

这种方法通过遍历dependencies列表,仅对Source为"S3"的项合并service_secrets:

- name: 合并S3凭据到对应依赖项
  set_fact:
    updated_product: >-
      {{
        product | combine({
          'dependencies': product.dependencies | map('combine', item if item.Source == 'S3' else {}) | list
        })
      }}
  vars:
    item: "{{ service_secrets }}"

方法二:通过索引定位替换

先找到目标项的索引,再替换为合并后的字典:

- name: 获取S3依赖项的索引
  set_fact:
    s3_dep_index: "{{ product.dependencies | index_of('item.Source == \"S3\"', wantlist=False) }}"

- name: 合并凭据到S3依赖项
  set_fact:
    updated_product: >-
      {{
        product | combine({
          'dependencies': product.dependencies[:s3_dep_index] +
                          [product.dependencies[s3_dep_index] | combine(service_secrets)] +
                          product.dependencies[s3_dep_index+1:]
        })
      }}

错误原因分析

你之前的代码存在两个核心问题:

  1. 使用loop遍历dependencies时,每次循环都会执行combine并通过list_merge="append"追加新列表项,导致service_secrets被作为独立项重复添加。
  2. combine({"dependencies": [service_secrets]}, list_merge="append")的逻辑是将[service_secrets]直接追加到原列表末尾,而非合并到已有项的字典中。

验证结果

合并后的updated_product.dependencies中,Source为"S3"的项会包含原有的字段(Name、Source、Type、Bucket)以及service_secrets中的Access_key_id、Access_key_secret、Endpoint字段。若存在重复键(如Bucket),combine会用service_secrets中的值覆盖原有值(此处两者值一致,无影响)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 15:02:42