如何在Ansible中访问包含点号的顶层变量?
问题原因与解决方法
错误根源
你的变量名(如ubuntu_20.04_codenames)包含点号,Ansible使用的Jinja2模板引擎会将点号解析为「对象属性访问」。比如ubuntu_20.04_codenames会被错误解读为:先取整数20对应的变量ubuntu_20,再尝试访问它的04_codenames属性,这显然不符合语法规则,因此抛出expected token 'end of statement block', got 'integer'错误。
解决方法
方法1:重命名变量(推荐)
把变量名中的点号替换为下划线,彻底避免Jinja2的解析歧义:
修改inventory中的变量定义:
all: vars: ubuntu_18_04_codenames: - 'bionic' - 'tara' - 'tessa' - 'tina' - 'tricia' ubuntu_20_04_codenames: - 'focal' - 'ulyana' - 'ulyssa' - 'uma' - 'una' ubuntu_22_04_codenames: - 'jammy' - 'vera' - 'vanessa' - 'Victoria'
任务中的when条件同步修改:
- name: "Adding Docker 20.04 APT repository" apt_repository: repo: deb https://download.docker.com/linux/ubuntu focal stable when: ansible_lsb.codename in ubuntu_20_04_codenames
方法2:保留原变量名,用字典方式引用
如果不想修改变量名,可通过vars字典直接按字符串键名访问变量,绕过Jinja2的属性解析逻辑:
- name: "Adding Docker 20.04 APT repository" apt_repository: repo: deb https://download.docker.com/linux/ubuntu focal stable when: ansible_lsb.codename in vars['ubuntu_20.04_codenames']
内容的提问来源于stack exchange,提问作者hydrian
相关产品推荐
相关产品推荐

