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

Ansible中遍历JSON对象列表校验status值并设置对应变量

Ansible 列表状态校验实现方案

你不需要手写循环逐个判断,直接用Ansible内置的Jinja2过滤器即可完成聚合判断,代码简洁且执行效率更高。

前置步骤:解析stdout为结构化数据

如果你拿到的是命令执行返回的stdout字符串,首先需要将其解析为结构化列表对象,假设你之前执行命令的注册变量名为cmd_exec_result:

- name: 解析stdout中的JSON列表
  ansible.builtin.set_fact:
    device_status_list: "{{ cmd_exec_result.stdout | from_json }}"

核心判断逻辑(两种写法选其一即可)

写法1:语义最直观的正向判断

通过map过滤器提取所有对象的status字段值,再用all测试器校验所有值是否均为connected:

- name: 计算全连接状态标记
  ansible.builtin.set_fact:
    all_device_connected: "{{ device_status_list | map(attribute='status') | all('equalto', 'connected') }}"
  • 当列表内所有对象的status均为connected时,all_device_connected值为true
  • 只要存在任意一个对象status为disconnected(或其他非connected值),变量值即为false

写法2:反向筛查异常项

通过selectattr筛选所有status为disconnected的对象,若筛选结果长度为0则说明无异常项:

- name: 计算全连接状态标记(反向判断)
  ansible.builtin.set_fact:
    all_device_connected: "{{ (device_status_list | selectattr('status', 'equalto', 'disconnected') | list | length) == 0 }}"

异常兼容处理

如果列表中可能存在缺失status键的异常对象,可以给map过滤器加默认值,避免模板渲染报错:

all_device_connected: "{{ device_status_list | map(attribute='status', default='abnormal') | all('equalto', 'connected') }}"

缺失status键的对象会被默认标记为abnormal,最终判断结果为false,不会中断playbook执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 21:33:24