Ansible条件语句禁用Jinja2分隔符,如何替换{{}}使用变量?
解决Ansible条件语句中动态键的引用问题
在Ansible的when条件里,本身就处于Jinja2的求值上下文,所以绝对不能再用{{ }}或{% %}这类模板分隔符——这是新手常踩的典型坑。要引用变量作为字典的键,你需要用中括号语法来替代点号+模板分隔符的写法,具体调整如下:
原条件的问题分析
你的原条件:
when: ansible_lvm.lvs.{{ resize_lvname }}.size_g < 10 and ansible_devices.{{ new_dev }}.size == "70.00 GB" and not "[new_dev].value.partitions"
这里有两个核心问题:一是用{{ }}插入变量作为字典键,违反了when条件的语法规则;二是最后一个判断的写法完全无效,不符合Ansible的表达式规范。
修正后的条件写法
把所有用变量作为键的部分,从字典.{{ 变量 }}改成字典[变量],同时修正最后一个判断的语法:
when: - ansible_lvm.lvs[resize_lvname].size_g < 10 - ansible_devices[new_dev].size == "70.00 GB" - not ansible_devices[new_dev].partitions
关键知识点解释
- 字典动态键的引用:当你需要用变量作为字典的键时,必须使用
[变量名]的形式。比如ansible_lvm.lvs[resize_lvname],意思是取ansible_lvm.lvs这个字典里,键名为resize_lvname变量值的那个条目。而点号(.)只能用于固定的、已知的键名(比如ansible_lvm.lvs.root.size_g里的root是固定键)。 when条件的上下文:when本身就是Jinja2表达式,所以直接写变量名、运算符、逻辑判断即可,不需要额外的模板分隔符包裹。- 最后一个判断的严谨性优化:如果担心
new_dev对应的设备不存在导致报错,可以加上存在性检查,同时用default过滤器避免空值问题:when: - ansible_lvm.lvs[resize_lvname].size_g < 10 - ansible_devices[new_dev] is defined - ansible_devices[new_dev].size == "70.00 GB" - not ansible_devices[new_dev].partitions | default(false)
额外场景参考
在Ansible中,所有需要动态引用字典键的场景(比如变量定义、模块参数里),都可以用中括号语法。比如你要把动态键对应的内容赋值给变量:
vars: current_lv_size: "{{ ansible_lvm.lvs[resize_lvname].size_g }}"
这里因为是在字符串模板里,所以需要{{ }}包裹,但在when这种纯表达式上下文里就完全不需要。
内容的提问来源于stack exchange,提问作者J H
相关产品推荐
相关产品推荐

