循环结果长什么样
循环任务注册变量后,拿到的是每轮结果组成的列表,每一项都带该轮的项目值与该次执行的返回字段。判断整体是否成功、提取某一项输出、把结果汇总成字典,都要按这个结构来操作。最常见的误区是把它当单个任务处理:直接访问返回字段会得到列表,按字段判断是否存在会失败,后续逻辑因此全部走偏。
基本信息
| 结果形态 | 每轮一个字典的列表,含该轮项目值与返回字段 |
|---|---|
| 常用字段 | 结果列表本身、变更计数、失败计数、每轮条目 |
| 取单项 | 先筛选再取,或按下标访问 |
| 汇总 | 用映射把每轮结果整理成键值结构 |
典型使用场景
- 批量收集多项资源的执行结果:注册后统一判断成功与否
- 判断循环中是否有任一项发生变更:按变更计数判断
- 提取某一项的输出:先按项目值筛选再取字段
- 把结果汇总成字典供后续引用:按项目值做键映射
- 允许部分失败继续执行:开启失败容忍后按结果列表逐项检查
注册与读取
注册与读取
- name: 循环并注册结果 # 结果是每轮一个条目的列表
ansible.builtin.command: "ls {{ item }}"
loop: [/etc, /tmp]
register: ls_out
- name: 按结构判断整体 # 变更与失败都以列表形式呈现
ansible.builtin.debug:
msg:
- "共 {{ ls_out.results | length }} 项"
- "已变更 {{ ls_out.changed | int }}"
- name: 提取某项输出 # 先筛选再取字段
ansible.builtin.debug:
msg: "{{ (ls_out.results | selectattr('item', 'equalto', '/tmp') | first).stdout }}"结果结构读法
| 表达式 | 含义 | 注意 |
|---|---|---|
| 结果列表 | 每轮一条,含项目与返回字段 | 直接取返回字段会失败 |
| 结果列表长度 | 循环执行的项数 | 被跳过的项不计入 |
| 变更标志 | 本次循环是否有变更 | 部分失败时取值可能仍为假 |
| 筛选后取首项 | 命中项的完整结果 | 无匹配项时取首项直接报错 |
循环注册变量在同名覆盖时会丢掉上一轮结果。需要保留就换一个变量名,或在下一轮执行前先把需要的字段提取到独立变量里。
循环中某一项失败默认会中断整个任务,注册变量里只剩失败之前的条目。要允许部分失败必须显式声明容忍,并在后续按结果列表逐项核对,不能只看整体标志。
从结果里挑数据
提取数据的顺序是先筛选再取值:先按项目值筛出目标项,再访问它的返回字段;直接按下标取会让脚本依赖执行顺序,插入一项后全线错位。需要把结果转成便于引用的结构时,用映射把项目值当键、需要的字段当值,后续引用就变成一次普通的字典取值。