Ansible 为什么playbook为组变量取错误的值?

Ansible 为什么playbook为组变量取错误的值?,ansible,ansible-inventory,Ansible,Ansible Inventory,我对组变量有问题。 示例:我有两个库存组group_A和group_B,并且在group_vars中也有相同名称的文件: inventories/ hosts.inv [group_A] server1 server2 [group_B] server3 server4

我对组变量有问题。 示例:我有两个库存组group_A和group_B,并且在group_vars中也有相同名称的文件:

inventories/ 
           hosts.inv    
             [group_A]
               server1
               server2
             [group_B]
               server3
               server4
             group_vars/
                  group_A - file
                    var_port: 9001
                  group_B - file
                    var_port: 9002 
问题是当我执行时:

 ansible-playbook  playbooks/playbook.yml -i inventories/hosts.inv -l group_B
playbook是为服务器的适当范围(server3、server4)执行的,但它从组变量文件group_A中获取变量

    expected result:        var_port: 9002
    in realty :             var_port: 9001
ansible 2.4.2.0


BR Oleg

我包括ANSIBLE_DEBUG,以及我发现的:

2018-05-03 15:23:23663 p=129458 u=user | 129458 1525353803.66336:从/ansible/inventory/prod/group_vars/group_B.yml加载数据 2018-05-03 15:23:23663 p=129458 u=user | 129661 1525353803.66060:运行中()-任务00505680-eccc-d94e-2b1b-0000000000 F4 2018-05-03 15:23:23664 p=129458 u=user | 129661 1525353803.66458:调用self._execute() 2018-05-03 15:23:23665 p=129458 u=user | 129458 1525353803.66589:从/ansible/inventory/prod/group_vars/group_.yml加载数据

在playbook执行时,ansible扫描文件夹组中包含变量且变量为“var\u port”的所有文件,最后一个将获胜….

您可以在另一个主题中找到:

从文件中:


我现在不清楚如何管理配置文件。在这种情况下,我必须为每个组使用唯一的变量名称,但在角色方面是不可能的,或者在调用playbook时我应该使用include_vars吗?

超级示例如何从DigitalOcean管理多级环境中的变量文件

请确保您在其他地方没有该变量,好吗?我已经用2.4.2测试了您的场景,效果很好:---名称:测试主机:所有收集事实:错误任务:-名称:打印变量调试:变量:变量端口任务[打印DBs(原始)]************************************************************************************************************************************************************************************************************************************************************************************************************************************************************端口任务:[[server4]=>{“var_port”:9002}同意@imjoseangel:如前所述,您的用例应该可以工作。当我在文件组变量“group_A”(使用#)中禁用变量var_port时,您可以尝试使用和选项
--graph
--vars
检查库存配置我的playbook从group_var文件“group_B”中获取正确的变量值9002。看起来playbook在所有group_文件中都是第一个,并且没有根据group条件进行过滤(在我的案例group_B中)我包括ANSIBLE_DEBUG 2018-05-03 15:23:23663 p=129458 u=user | 129458 1525353803.66336:从/ANSIBLE/inventory/prod/group_vars/p_dseoper.yml 2018-05-03 15:23:23663 p=129458 u=user 1246611525353803.66060加载数据:运行中()-任务00505680-eccc-d94e-2b1b-0000000000 F4 2018-05-03 15:23:23664 p=129458 u=user 1246611525353803.66458:调用self._execute()2018-05-03 15:23:23665 p=129458 u=user | 129458 1525353803.66589:从/ansible/inventory/prod/group_vars/t_dseoper.yml加载数据这似乎仍然是设置变量的最自然的方式,不受支持,您最终的解决方案是什么?
Note

Within any section, redefining a var will overwrite the previous instance. If multiple groups have the same variable, **the last one loaded wins**. If you define a variable twice in a play’s vars: section, the **2nd one wins**.