Ansible inventory中如何根据调用的父组实现对应变量继承
问题根本原因
Ansible解析inventory时会合并主机归属的所有组的变量,同优先级的组变量按inventory中定义的顺序加载,后定义的会覆盖先定义的。不管执行时指定哪个组作为目标,只要主机同时属于三个父组,最终加载的变量都是最后定义的group3的变量值。
解决方案
方案1:调整inventory结构,使用主机别名隔离变量
该方案无需修改执行命令,适配性最高,给同一个物理主机配置不同的inventory别名,分别归属不同组,避免同一个主机同时归属多个变量冲突的组:
[group1] host_group1 ansible_host=192.168.1.2 [group2] host_group2 ansible_host=192.168.1.2 [group3] host_group3 ansible_host=192.168.1.2 [group1:vars] my_var="DOG" [group2:vars] my_var="CAT" [group3:vars] my_var="FISH"
执行命令直接指定对应组即可拿到对应变量:
- 执行
ansible -m debug -a "var=my_var" group1,返回my_var="DOG" - 执行
ansible -m debug -a "var=my_var" group2,返回my_var="CAT" - 执行
ansible -m debug -a "var=my_var" group3,返回my_var="FISH"
如果需要统一操作该主机,可额外新增公共组归集所有别名即可。
方案2:执行时显式指定变量
如果不想修改原有inventory结构,可在执行命令时通过--extra-vars参数主动传入对应变量:
# 调用group1时执行 ansible -m debug -a "var=my_var" group1 --extra-vars 'my_var="DOG"'
方案3:动态判断执行目标组赋值
如果需要兼顾原有inventory结构和灵活调用,可在公共变量配置中添加如下逻辑,根据执行时限制的组名动态返回变量值:
my_var: >- {% if ansible_limit == 'group1' %} "DOG" {% elif ansible_limit == 'group2' %} "CAT" {% elif ansible_limit == 'group3' %} "FISH" {% else %} "FISH" {% endif %}
执行时加--limit指定对应组即可:
ansible -m debug -a "var=my_var" all --limit group1
内容的提问来源于stack exchange,提问作者Kucharsky
相关产品推荐
相关产品推荐

