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
相关产品推荐
相关产品推荐

