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
相关产品推荐
相关产品推荐

