Ansible Playbook变量转义问题:动态获取主机组主机数失败
问题:Ansible中通过变量引用主机组并统计主机数量报错
我想在total_hosts: "{{ groups['site'] | length }}"里像第一行- hosts: '{{ site }}'那样,用已定义的site变量加载对应的主机组,但使用变量时出现如下错误:
{"msg": "The task includes an option with an undefined variable. The error was: {{ groups['{{vars[site]}}'] | length }}: 'dict object' has no attribute '{{vars[site]}}'."
对应的Playbook代码:
--- - hosts: '{{ site }}' gather_facts: false vars: total_hosts: "{{ groups['{{vars[site]}}'] | length }}" tasks: - name: Test Connection ansible.windows.win_ping: - name: Total Hosts debug: msg: "{{ total_hosts }}"
解决方案
问题出在嵌套的Jinja2模板语法,在Ansible变量的{{ }}内部不需要再嵌套模板标记。直接修改total_hosts的定义即可:
--- - hosts: '{{ site }}' gather_facts: false vars: total_hosts: "{{ groups[site] | length }}" tasks: - name: Test Connection ansible.windows.win_ping: - name: Total Hosts debug: msg: "{{ total_hosts }}"
原因说明
当你在{{ }}中编写表达式时,直接使用变量名site即可,Ansible会自动解析它的值作为主机组名称去groups字典中查找。原写法里的groups['{{vars[site]}}']是错误的嵌套,会让Ansible把{{vars[site]}}当成字面量的键去查找,而不是解析变量值,所以才会提示找不到对应的组属性。
内容的提问来源于stack exchange,提问作者Tonis
相关产品推荐
相关产品推荐

