Ansible中如何在Jinja循环中使用动态变量名
如何在Ansible Jinja2循环中使用动态变量引用字典?
你的错误出在Jinja2模板的语法使用上:在{% ... %}这种控制结构标签内部,不需要再用{{ ... }}来包裹变量,直接使用变量名即可。原来的写法把{{ app }}放在for循环的控制块里,导致模板解析器识别到语法错误。
解决方法:使用vars查找动态变量
我们可以通过vars字典来动态拼接变量名,获取对应的字典内容。修改你的test.yml中的debug任务如下:
--- # test.yml - hosts: localhost gather_facts: no tasks: - include_vars: file: varsfile.yml - debug: msg: | {% for property, value in vars[app ~ '_properties'].items() %} {{ property }}={{ value }} {% endfor %}
原理说明
app ~ '_properties'会把传入的app变量值和_properties字符串拼接成完整的变量名(比如myapp1_properties)vars[拼接后的变量名]可以直接从当前作用域中获取对应的字典变量- 之后就可以正常用
items()遍历字典的键值对了
可选方案:先赋值临时变量(可读性更强)
如果你觉得直接在循环里写拼接逻辑不够直观,也可以先通过set_fact把目标字典赋值给一个临时变量:
--- # test.yml - hosts: localhost gather_facts: no tasks: - include_vars: file: varsfile.yml - set_fact: target_properties: "{{ vars[app ~ '_properties'] }}" - debug: msg: | {% for property, value in target_properties.items() %} {{ property }}={{ value }} {% endfor %}
验证结果
执行ansible-playbook test.yml -e "app=myapp1",输出会符合预期:
PLAY [localhost] *********************************************************************************************************************************************************************** TASK [include_vars] ******************************************************************************************************************************************************************** mardi 30 août 2022 15:43:48 +0200 (0:00:00.020) 0:00:00.020 ************ ok: [localhost] TASK [debug] *************************************************************************************************************************************************************************** mardi 30 août 2022 15:43:48 +0200 (0:00:00.028) 0:00:00.048 ************ ok: [localhost] => msg: |- key1=value1 key2=value2
执行ansible-playbook test.yml -e "app=myapp2"时:
PLAY [localhost] *********************************************************************************************************************************************************************** TASK [include_vars] ******************************************************************************************************************************************************************** mardi 30 août 2022 15:43:40 +0200 (0:00:00.020) 0:00:00.020 ************ ok: [localhost] TASK [debug] *************************************************************************************************************************************************************************** mardi 30 août 2022 15:43:40 +0200 (0:00:00.030) 0:00:00.050 ************ ok: [localhost] => msg: |- key1=value1
内容的提问来源于stack exchange,提问作者Wrest
相关产品推荐
相关产品推荐

