如何在Ansible的Jinja2模板中应用各类条件判断?
嘿,这就给你逐个拆解Ansible Jinja2里这些常见的条件判断场景,都是日常写模板时高频用到的:
1. 判断item.value是否存在值
这里要区分「变量已定义」和「变量有实际值」,如果是要确保item.value不仅被定义,还不是空字符串、None这类“无意义”值,可以这么写:{% if item.value is defined and item.value %} # 当item.value存在且有有效内容时执行的逻辑 {% endif %}要是你能确定
item.value一定已定义,只是想判断它非空,直接写{% if item.value %}也能生效——Jinja2会自动把空字符串、None、空列表/字典都视为False。2. 判断item.value是否等于"A"
最基础的相等判断,直接用==运算符就行:{% if item.value == "A" %} # 当item.value严格等于"A"时执行的逻辑 {% endif %}3. 判断item.value等于"A",否则等于"B"
这种二选一的场景用三元表达式最简洁,一行搞定:{{ "A" if item.value == "A" else "B" }}要是逻辑复杂点,也可以用标准的if-else块:
{% if item.value == "A" %} A {% else %} B {% endif %}4. 判断(item.value等于"A"且等于"B") 或者 (item.value等于"A"且等于"c")
注意哦,item.value不可能同时等于"A"和"B",可能你是想表达不同属性的判断?不过按你给出的逻辑,写法是这样的——记得用括号明确优先级:{% if (item.value == "A" and item.value == "B") or (item.value == "A" and item.value == "c") %} # 满足任一组合条件时执行的逻辑 {% endif %}实际场景里如果是判断
item的不同属性(比如item.a和item.b),调整变量名就行,逻辑运算符and(且)、or(或)的用法就是这样。5. 判断item.value等于"A",否则如果等于"B",否则等于"c"
多重分支判断用elif关键字,清晰直观:{% if item.value == "A" %} # 处理A的情况 {% elif item.value == "B" %} # 处理B的情况 {% else %} # 处理C的情况 {% endif %}要是想写在一行里,也可以嵌套三元表达式:
{{ "A" if item.value == "A" else "B" if item.value == "B" else "c" }}6. 判断item.value不等于空字符串或不为null
要同时排除null(也就是Jinja2里的none)和空字符串,稳妥的写法是:{% if item.value is not none and item.value != "" %} # 当item.value既不是None也不是空字符串时执行的逻辑 {% endif %}或者用
default过滤器简化,把None转换成空字符串后再判断:{% if item.value | default("") != "" %} # 同样能达到排除None和空字符串的效果 {% endif %}
内容的提问来源于stack exchange,提问作者roberjames

