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

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 }}"

代码说明

  1. 解析JSON并收集列表:
    • 用default([])初始化空列表,每次循环把解析后的字典(item | from_json)追加到列表中,最终docker_parsed_containers会成为包含所有容器信息的字典列表。
  2. 提取指定属性:
    • 先用map(attribute='ID')和map(attribute='CreatedAt')分别提取所有容器的ID和创建时间,再用zip把对应位置的元素配对,最后用map('dict', ['ID', 'CreatedAt'])把每对元素转成包含指定键的字典,最终得到你需要的结构化列表。

运行这段代码后,就能得到包含每个容器ID和CreatedAt属性的列表了。

内容的提问来源于stack exchange,提问作者Augunrik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:57:38