Ansible中如何合并不同vars文件定义的同名变量值?
原因说明
Ansible 默认对同名变量采用后加载覆盖规则,无论变量是字典还是列表类型,都不会自动执行合并逻辑。循环加载两个变量文件时,后加载的app2.yml中定义的dbconn会直接覆盖前序app1.yml加载的同名变量,因此debug输出仅包含app2里的两条数据。
可直接落地的实现方案
不要把两个变量文件的内容直接加载到全局根命名空间,加载时给每个文件的变量分配独立的命名前缀,避免同名覆盖,之后手动拼接两个列表即可,修改后的main.yml代码如下:
- name: 加载变量文件,通过name参数指定独立命名空间 include_vars: file: "{{ playbook_dir }}/{{ item }}.yml" name: "vars_{{ item }}" loop: - app1 - app2 run_once: yes - name: 拼接两个文件中的dbconn列表 set_fact: dbconn: "{{ vars_app1.dbconn + vars_app2.dbconn }}" - debug: msg: "{{ dbconn }}"
运行后就能得到预期的3条数据的结果。
注意:不建议通过修改ansible.cfg中
hash_behaviour=merge的方式实现需求,一是该配置默认仅对字典类型生效,列表类型依然会直接覆盖;二是全局修改该配置会改变所有变量的加载逻辑,很容易引发不可预期的变量冲突,大幅提升问题排查成本。
内容的提问来源于stack exchange,提问作者Ashar
相关产品推荐
相关产品推荐

