如何在Jinja2 Ansible的IF条件中检查动态拼接的列表变量是否定义?
为什么Jinja2里{{ app_name }}_env_vars没法解析成testapp_env_vars?
我懂你的困扰——你想通过app_name的值动态拼接出变量名,然后遍历对应的列表,但直接写{{ app_name }}_env_vars完全不生效对吧?
问题出在Jinja2的语法规则上:在{% ... %}这种控制结构标签里,你不能用{{ ... }}来包裹变量,而且直接把变量名和字符串硬拼在一起的写法,Jinja2会把它当成一个固定的字面量变量名(比如就认成{{ app_name }}_env_vars),而不是动态拼接出来的testapp_env_vars。
那该怎么解决呢?其实Jinja2的上下文里有个vars字典,它包含了所有你定义的变量。你可以先把app_name和_env_vars拼接成目标变量名的字符串,再通过vars字典去获取对应的变量。
给你改好的模板代码:
{% if vars[app_name ~ '_env_vars'] is defined %} {% for item in vars[app_name ~ '_env_vars'] %} {{ item.name }}: {{ item.value }} {% endfor %} {% endif %}
或者你也可以先把动态获取到的变量存起来,让代码更清晰:
{% set target_env_vars = vars[app_name ~ '_env_vars'] %} {% if target_env_vars is defined %} {% for item in target_env_vars %} {{ item.name }}: {{ item.value }} {% endfor %} {% endif %}
这里的~是Jinja2里的字符串拼接运算符,app_name ~ '_env_vars'会把app_name的值(也就是testapp)和_env_vars拼成testapp_env_vars,然后vars[...]就会从变量字典里取出你定义的那个列表,这样就能正常遍历输出你要的键值对了。
内容的提问来源于stack exchange,提问作者Muhammed Roshan
相关产品推荐
相关产品推荐

