Ansible Inventory组变量优先级疑问及指定组变量使用咨询
Ansible 多组主机变量合并与指定变量使用问题
问题一:为什么vm01的ansible_user是test组的user2而非web组的user1?
你混淆了两种变量的合并规则:
- 你当前是在组的hosts条目下给单个主机定义变量,这属于「组内主机变量」,不是「组变量」。组变量是给整个组所有主机统一设置的(需要写在组的
vars块里)。 - 对于这种组内主机变量,Ansible的处理逻辑是按组名的ASCII降序顺序覆盖:组名ASCII码越小,处理顺序越靠后,后处理的组变量会覆盖先处理的。你的
test(ASCII码116)比web(ASCII码119)小,所以test组的变量最后生效,ansible_user取user2。 - 你看到的「同层级组变量按ASCII顺序合并」的规则,只适用于组变量(组的
vars块里的变量),和你当前的写法无关。
如果改成组变量的写法,就会符合你预期的规则:
web: vars: ansible_user: user1 hosts: vm01: ansible_host: foo.example.com test: vars: ansible_user: user2 hosts: vm01:
此时组变量按ASCII升序合并,web(w)在test(t)之后,所以web的变量会覆盖test的,最终ansible_user是user1。
问题二:如何确保Ansible运行时使用test组的ansible_user变量?
你的当前配置已经默认使用了test组的变量,如果需要在其他场景下强制指定,有几种简单方式:
命令行直接指定:利用Ansible变量优先级,命令行传入的变量优先级最高,直接覆盖所有配置:
ansible vm01 -i inventory.yaml -e "ansible_user=user2"区分变量名后直接引用:把不同组的变量改成不同名称,在playbook里明确指定使用test组的变量:
修改清单:web: hosts: vm01: ansible_host: foo.example.com web_user: user1 test: hosts: vm01: test_user: user2在playbook中指定:
- hosts: vm01 vars: ansible_user: "{{ test_user }}" tasks: - debug: msg: "当前使用用户: {{ ansible_user }}"用组变量结合条件判断:如果改成组变量,可以通过判断主机所属组来强制使用test组的变量:
- hosts: vm01 tasks: - name: 强制使用test组的用户 set_fact: ansible_user: "{{ hostvars['vm01']['ansible_user'] }}" when: "'test' in group_names" - debug: var=ansible_user
内容的提问来源于stack exchange,提问作者Ssaf
相关产品推荐
相关产品推荐

