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

Ansible Playbook中合并多个vars文件的方法求助

解决Ansible拆分vars文件后变量合并问题

问题原因

Ansible加载多个同名变量时,默认会用后加载的变量值完全覆盖前一个,而非合并字典内的列表结构。你拆分后的host2.yml会覆盖host1.yml中的icinga2_objects,导致host1的配置丢失。

解决方案

方法1:拆分变量名后手动合并列表

修改两个主机的vars文件,使用独立的变量名:

host1.yml

host1_icinga_objects:
  internal.icinga:
    - name: host1.fqdn
       type: Host
       file: zones.d/main/host1.fqdn.conf
       address: 127.0.0.2

host2.yml

host2_icinga_objects:
  internal.icinga:
    - name: host2.fqdn
       type: Host
       file: zones.d/main/host2.fqdn.conf
       address: 127.0.0.3

在Playbook中合并两个列表到目标变量:

- name: Build Icinga Image
  hosts: all
  become: yes
  vars_files:
    - vars/icinga-config/host1.yml
    - vars/icinga-config/host2.yml
  vars:
    icinga2_objects:
      internal.icinga: "{{ host1_icinga_objects['internal.icinga'] + host2_icinga_objects['internal.icinga'] }}"
  collections:
    - icinga.icinga

  tasks:     
    - ansible.builtin.include_role:
        name: icinga2        

方法2:使用include_vars模块的合并选项

放弃vars_files,改用include_vars模块逐个加载变量并指定合并规则:

- name: Build Icinga Image
  hosts: all
  become: yes
  collections:
    - icinga.icinga

  tasks:
    - name: 加载host1配置并合并
      ansible.builtin.include_vars:
        file: vars/icinga-config/host1.yml
        merge: hash_behaviour=merge

    - name: 加载host2配置并合并
      ansible.builtin.include_vars:
        file: vars/icinga-config/host2.yml
        merge: hash_behaviour=merge

    - ansible.builtin.include_role:
        name: icinga2        

注意:该方式下字典会递归合并,但列表默认会被覆盖,若需要追加列表,仍需配合变量结构调整或combine过滤器。

方法3:用combine过滤器递归合并字典与列表

同样修改vars文件变量名,再通过combine过滤器实现字典递归合并,同时追加列表:

host1.yml和host2.yml同方法1,Playbook调整为:

- name: Build Icinga Image
  hosts: all
  become: yes
  vars_files:
    - vars/icinga-config/host1.yml
    - vars/icinga-config/host2.yml
  vars:
    icinga2_objects: "{{ host1_icinga_objects | combine(host2_icinga_objects, recursive=True, list_merge='append') }}"
  collections:
    - icinga.icinga

  tasks:     
    - ansible.builtin.include_role:
        name: icinga2        

list_merge='append'会将两个字典中同名列表的元素合并,而非替换。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 20:35:40