You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:09:07