Ansible循环列表收集结果报错:出现AnsibleUndefined对象求排查
问题分析与修复方案
你的代码主要有三个关键问题,导致出现AnsibleUndefined错误,无法生成预期的容器属性列表:
1. 循环时覆盖变量而非收集为列表
你在Convert variables任务里用set_fact循环处理每个容器的JSON字符串,但每次循环都会覆盖docker_raw_container_item变量,最后这个变量只会保留最后一个容器的解析结果,而不是所有容器的集合。
2. JSON解析方向搞反了
docker ps的{% raw %}"{{json .}}"{% endraw %}参数已经输出的是JSON字符串,你需要用from_json把字符串解析成Ansible可处理的字典对象,而不是用to_json(to_json是把字典转成字符串,完全搞反了解析方向)。
3. 基于单个变量做列表操作
最后一步的map(attribute='ID')是针对列表的操作,但你用的docker_raw_container_item是单个字典(甚至可能因为前面的错误变成未定义状态),自然会触发AnsibleUndefined错误。
修复后的完整代码
- name: Collect all containers command: docker ps --all --no-trunc --format {% raw %}"{{json .}}"{% endraw %} register: docker_raw_containers - name: Parse container JSON strings into a list of dictionaries set_fact: docker_parsed_containers: "{{ docker_parsed_containers | default([]) + [item | from_json] }}" loop: "{{ docker_raw_containers.stdout_lines }}" - name: Extract container ID and CreatedAt into a new list set_fact: container_id_created_list: "{{ docker_parsed_containers | map(attribute='ID') | zip(docker_parsed_containers | map(attribute='CreatedAt')) | map('dict', ['ID', 'CreatedAt']) | list }}" - name: Debug the result debug: msg: "{{ container_id_created_list }}"
代码说明
- 解析JSON并收集列表:
- 用
default([])初始化空列表,每次循环把解析后的字典(item | from_json)追加到列表中,最终docker_parsed_containers会成为包含所有容器信息的字典列表。
- 用
- 提取指定属性:
- 先用
map(attribute='ID')和map(attribute='CreatedAt')分别提取所有容器的ID和创建时间,再用zip把对应位置的元素配对,最后用map('dict', ['ID', 'CreatedAt'])把每对元素转成包含指定键的字典,最终得到你需要的结构化列表。
- 先用
运行这段代码后,就能得到包含每个容器ID和CreatedAt属性的列表了。
内容的提问来源于stack exchange,提问作者Augunrik
相关产品推荐
相关产品推荐

