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

如何用Ansible对比两个API返回JSON中LastModified不同的对象

解决Ansible中对比两台服务器AppCoreDetails差异对象的方案

假设你已通过API调用注册了两个字典类型变量(比如server1_response和server2_response),其中包含AppCoreDetails数组字段。以下是两种实用的方法,提取其中LastModified日期不同的对象集合:

方法一:Ansible原生过滤器实现

1. 转换数组为键值对字典

先将两个AppCoreDetails数组转换为以对象唯一标识(比如Id,替换为你实际的唯一字段)为键的字典,方便精准匹配:

- name: 将AppCoreDetails转为键值对字典
  set_fact:
    server1_details_map: "{{ server1_response.AppCoreDetails | items2dict(key_name='Id', value_name='.') }}"
    server2_details_map: "{{ server2_response.AppCoreDetails | items2dict(key_name='Id', value_name='.') }}"

2. 遍历对比提取差异

遍历其中一个字典,匹配另一台服务器的对应对象,筛选出LastModified不同的条目:

- name: 提取LastModified不同的对象
  set_fact:
    differing_core_details: "{{ differing_core_details | default([]) + [item.value] }}"
  loop: "{{ server1_details_map | dict2items }}"
  when:
    - server2_details_map[item.key] is defined
    - server2_details_map[item.key].LastModified != item.value.LastModified

执行后,differing_core_details变量将存储所有符合条件的差异对象。

方法二:结合jq工具快速处理

如果习惯用jq处理JSON,可以直接将两个数组传入jq进行对比:

- name: 用jq筛选差异对象
  set_fact:
    differing_core_details: "{{ 
      [server1_response.AppCoreDetails, server2_response.AppCoreDetails] 
      | to_json 
      | jq('.[0] as $s1 | .[1] as $s2 | $s1[] | select(($s2[] | select(.Id == .Id).LastModified) != .LastModified)')
      | from_json 
    }}"

注意:同样需要将.Id替换为你实际用来匹配对象的唯一字段。

额外注意事项

  • 若LastModified存在时区或格式差异,需先统一格式再对比,比如用to_datetime转换为时间对象:
    when:
      - server2_details_map[item.key] is defined
      - (item.value.LastModified | to_datetime) != (server2_details_map[item.key].LastModified | to_datetime)
    
  • 确保两台服务器返回的AppCoreDetails对象存在可唯一匹配的字段,否则无法准确对应对比。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:27:39