Ansible角色默认变量优先级高于组变量?求原因解析
问题原因与解决方法
你的问题核心是项目根目录的group_vars/all.yml未被Ansible正确加载,导致角色默认变量中的users成为唯一有效定义。
具体原因
当你通过-i inventories/production.yml指定inventory文件时,Ansible默认优先在该inventory文件所在的目录(inventories/)下查找group_vars和host_vars目录。你把group_vars/all.yml放在了项目根目录,而inventories/目录下没有对应的group_vars子目录,因此Ansible并未加载这个变量文件。此时只有roles/base/defaults/main.yml里的users变量生效,所以遍历的是user2、user3、user4。
当你删除角色默认变量中的users后,Ansible才会加载项目根目录的group_vars/all.yml(取决于你的ansible.cfg配置),因此会使用user1、user2的列表。
解决方法
- 规范目录结构(推荐):将项目根目录的
group_vars/目录移动到inventories/目录下,形成inventories/group_vars/all.yml。这样当指定-i inventories/production.yml时,Ansible会正确加载该变量文件,其优先级高于角色默认变量,会覆盖roles/base/defaults/main.yml中的users定义。 - 调整配置(可选):修改
ansible.cfg中的相关配置,确保项目根目录的group_vars被纳入变量加载路径,但这种方式不符合Ansible的常规目录规范,不推荐。
内容的提问来源于stack exchange,提问作者Philipp S
相关产品推荐
相关产品推荐

