使用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}) }}
代码说明
- 合并components列表:通过循环遍历两个文件的
components列表,以每个项的name作为字典键,将同名字段的内容递归合并。这样paas项的subnets(来自两个文件)和delegation(来自standard_y)会被整合到同一个字典中。 - 整合所有变量:先合并顶层的非列表变量(比如
paas_id、vnet等),再用处理后的merged_components替换原有的components列表。
执行后,my_vars的结果会完全符合你期望的输出:components中无重复项,paas项包含所有合并后的配置,其他顶层变量也正确保留。
内容的提问来源于stack exchange,提问作者Arnau Amargant
相关产品推荐
相关产品推荐

