如何在Ansible同一节点的字典定义中引用变量?
Ansible字典同节点变量引用问题解决办法
在字典定义阶段直接引用同节点的变量是行不通的,原因有两个:一是Ansible解析变量时,当前节点的变量还没完全加载完成;二是item是循环(比如with_dict)时才会生成的临时变量,在定义字典的阶段根本不存在。
给你几个可行的解决思路:
方法一:使用时动态拼接值
不需要提前在字典里定义var2,等到任务中循环处理字典的时候,直接构造需要的内容:
- name: 输出应用信息 debug: msg: "The application {{ item.value.name }}" loop: "{{ applications | dict2items }}"
如果需要把这个值永久存在字典里,可以用set_fact生成新的字典:
- name: 生成包含var2的应用字典 set_fact: apps_with_var2: "{{ apps_with_var2 | default({}) | combine({ item.key: item.value | combine({ 'var2': 'The application ' ~ item.value.name }) }) }}" loop: "{{ applications | dict2items }}"
方法二:用Jinja2模板生成字典
如果你的应用字典结构固定、数量较多,适合用模板来生成整个字典。先创建一个模板文件apps_template.j2:
applications: app1: name: app1 var1: foo var2: "The application {{ app1.name }}" app2: name: app2 var1: bar var2: "The application {{ app2.name }}"
然后在playbook里加载这个模板生成变量:
- name: 加载模板生成的应用变量 include_vars: file: apps_template.j2 name: applications
方法三:利用set_fact预先生成完整字典
如果不想用模板,也可以直接用set_fact来构建整个字典,这样就能直接引用同节点的变量:
- name: 定义应用字典 set_fact: applications: app1: name: app1 var1: foo var2: "The application {{ applications.app1.name }}" app2: name: app2 var1: baz var2: "The application {{ applications.app2.name }}"
不过这个方法需要注意执行顺序,确保变量被正确赋值。
内容的提问来源于stack exchange,提问作者DarkWater
相关产品推荐
相关产品推荐

