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

使用ansible.builtin.include_vars合并YAML文件遇重复项求助

解决Ansible中YAML列表按指定字段合并的问题

你当前使用combine过滤器的append_rp选项无法正确合并components列表中name相同的项(比如paas),原因是append_rp基于整个列表项的哈希值去重,而两个paas项内容不同,会被视为独立元素保留,导致重复。要实现按name字段合并同名字典项,需要自定义处理逻辑。

具体实现方案

- name: Load x vars
  ansible.builtin.include_vars:
    file: vars/standard_x.yaml
    name: standard_x

- name: Load y vars
  ansible.builtin.include_vars:
    file: vars/standard_y.yaml
    name: standard_y

- name: Merge components by name field
  ansible.builtin.set_fact:
    merged_components: >-
      {% set comp_dict = {} %}
      {% for item in standard_x.components + standard_y.components %}
        {% set _ = comp_dict.update({item.name: comp_dict.get(item.name, {}) | combine(item, recursive=True)}) %}
      {% endfor %}
      {{ comp_dict.values() | list }}

- name: Combine all final variables
  ansible.builtin.set_fact:
    my_vars: >-
      {{ standard_x | combine(standard_y, recursive=True) | combine({'components': merged_components}) }}

代码说明

  1. 合并components列表:通过循环遍历两个文件的components列表,以每个项的name作为字典键,将同名字段的内容递归合并。这样paas项的subnets(来自两个文件)和delegation(来自standard_y)会被整合到同一个字典中。
  2. 整合所有变量:先合并顶层的非列表变量(比如paas_id、vnet等),再用处理后的merged_components替换原有的components列表。

执行后,my_vars的结果会完全符合你期望的输出:components中无重复项,paas项包含所有合并后的配置,其他顶层变量也正确保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:54:57