首页/系统与基础设施/自动化运维速查/循环中的变量注册与结果合并
Ansible 核心70 条

循环中的变量注册与结果合并

循环任务注册后的结果是每轮一个条目的列表,含项目值与返回字段;判断整体看变更与失败计数,提取单值要先按项目值筛选再取字段,别把它当单个任务的结果用。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​‌‌​​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​​​​​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌‌​​‌​​​‌​‌‌​‌​‌‌‌​‌‌​​‌‌​​​​‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​​​​‌​‌‌​​​‌​​‌‌​‌‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​‌‌​‌​‌‌​​‌​‌​‌‌‌​​‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

循环结果长什么样

循环任务注册变量后,拿到的是每轮结果组成的列表,每一项都带该轮的项目值与该次执行的返回字段。判断整体是否成功、提取某一项输出、把结果汇总成字典,都要按这个结构来操作。最常见的误区是把它当单个任务处理:直接访问返回字段会得到列表,按字段判断是否存在会失败,后续逻辑因此全部走偏。

基本信息

结果形态每轮一个字典的列表,含该轮项目值与返回字段
常用字段结果列表本身、变更计数、失败计数、每轮条目
取单项先筛选再取,或按下标访问
汇总用映射把每轮结果整理成键值结构

典型使用场景

  • 批量收集多项资源的执行结果:注册后统一判断成功与否
  • 判断循环中是否有任一项发生变更:按变更计数判断
  • 提取某一项的输出:先按项目值筛选再取字段
  • 把结果汇总成字典供后续引用:按项目值做键映射
  • 允许部分失败继续执行:开启失败容忍后按结果列表逐项检查

注册与读取

注册与读取
- 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 }}"

结果结构读法

表达式含义注意
结果列表每轮一条,含项目与返回字段直接取返回字段会失败
结果列表长度循环执行的项数被跳过的项不计入
变更标志本次循环是否有变更部分失败时取值可能仍为假
筛选后取首项命中项的完整结果无匹配项时取首项直接报错
循环注册变量在同名覆盖时会丢掉上一轮结果。需要保留就换一个变量名,或在下一轮执行前先把需要的字段提取到独立变量里。
循环中某一项失败默认会中断整个任务,注册变量里只剩失败之前的条目。要允许部分失败必须显式声明容忍,并在后续按结果列表逐项核对,不能只看整体标志。

从结果里挑数据

提取数据的顺序是先筛选再取值:先按项目值筛出目标项,再访问它的返回字段;直接按下标取会让脚本依赖执行顺序,插入一项后全线错位。需要把结果转成便于引用的结构时,用映射把项目值当键、需要的字段当值,后续引用就变成一次普通的字典取值。

易错点

  • 把循环注册结果当单项使用,访问返回字段时报类型错误
  • 只看整体变更标志就认定全部成功,忽略被跳过的项与部分结果
  • 用筛选后取首项的方式取值,没有匹配项时直接报错中断
  • 同名变量在后续任务里被覆盖,上一轮结果丢失且难以追溯
  • 未声明失败容忍就期望循环跑完,实际中途中断只剩部分结果

数据来源与参考

  • Ansible 官方文档 Loops(register 与 results)
  • Ansible 官方文档 Conditionals(结果判断示例)
  • Ansible 官方文档 Filters(selectattr/map)

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/loop-register-variable-merging.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​‌‌​​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​​​​​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌‌​​‌​​​‌​‌‌​‌​‌‌‌​‌‌​​‌‌​​​​‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​​​​‌​‌‌​​​‌​​‌‌​‌‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​‌‌​‌​‌‌​​‌​‌​‌‌‌​​‌​​‌‌​​‌‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​