Ansible中向列表追加字典时遇到问题求助
Ansible列表追加字典问题解决
问题说明
在向Ansible列表中追加字典时出现两个问题:
numbers列表的第一个值未被处理,输出遗漏对应项- 最终输出为列表嵌套列表结构,而非预期的字典列表
原代码
- name: Initialize list for numbers ansible.builtin.set_fact: numbers: [123, 456, 789] - name: Initialize list of objects ansible.builtin.set_fact: resources: [] - name: Initialize object ansible.builtin.set_fact: resource: {} - name: Creating object for reference ansible.builtin.set_fact: resource: - projectRef: external: 'projects/{{ item }}' resources: "{{ resources + [ resource ] }}" loop: "{{ numbers }}"
实际输出
[ {}, [ { 'projectRef': { 'external': 'projects/123' } } ], [ { 'projectRef': { 'external': 'projects/456' } } ] ]
预期输出
[ { 'projectRef': { 'external': 'projects/123' } }, { 'projectRef': { 'external': 'projects/456' } }, { 'projectRef': { 'external': 'projects/789' } } ]
问题原因
- 提前初始化的空字典
resource: {}被直接加入了resources列表的第一个位置,循环生成的内容从第二个元素开始,导致numbers的第一个值被覆盖遗漏 - 设置
resource时使用了列表语法(- projectRef:),使得resource本身是一个列表,追加到resources后形成嵌套结构
修正方案
方案一:简化步骤直接构造字典
- name: Initialize list for numbers ansible.builtin.set_fact: numbers: [123, 456, 789] - name: Initialize list of objects ansible.builtin.set_fact: resources: [] - name: Build resources list ansible.builtin.set_fact: resources: "{{ resources + [ {'projectRef': {'external': 'projects/{{ item }}'}} ] }}" loop: "{{ numbers }}"
方案二:用default简化初始化
- name: Initialize list for numbers ansible.builtin.set_fact: numbers: [123, 456, 789] - name: Build resources list ansible.builtin.set_fact: resources: "{{ resources | default([]) + [ {'projectRef': {'external': 'projects/' ~ item}} ] }}" loop: "{{ numbers }}"
修正说明
- 移除了多余的
resource变量初始化步骤,直接在循环中构造单个字典对象并追加到resources - 避免使用列表语法定义
projectRef,确保每次追加的是字典而非列表,消除嵌套问题 - 方案二中的
| default([])可以省略单独的列表初始化步骤,当resources未定义时自动初始化为空列表
内容的提问来源于stack exchange,提问作者mdudek579
相关产品推荐
相关产品推荐

