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

