Ansible 比较两个 JSON 响应

问题描述 投票:0回答:1

我使用 Ansible 在两个不同的服务器上调用相同的管理 API,然后使用 jq 从响应中选择应用程序的核心详细信息。

根据 Ansible type_debug 注册的变量是 dict 类型

ok: [localhost] => {
    "node1_applications | type_debug": "dict"
}
ok: [localhost] => {
    "node2_applications | type_debug": "dict"
}

两个响应的 JSON 如下所示

{
  "Node": "ESB1",
  "AppCoreDetails": [
    {
      "ApplicationName": "APP_Config_V1",
      "LastModified": "2023-08-25 12:23:26"
    },
    {
      "ApplicationName": "APP_Intervals_V1",
      "LastModified": "2022-11-23 14:46:58"
    }
  ]
}
{
  "Node": "ESB2",
  "AppCoreDetails": [
    {
      "ApplicationName": "APP_Config_V1",
      "LastModified": "2023-08-25 12:03:30"
    },
    {
      "ApplicationName": "APP_Intervals_V1",
      "LastModified": "2022-11-23 14:46:58"
    }
  ]
}

AppCoreDetails 中第一个条目的 LastModified 日期不同,而第二个条目的 LastModified 日期相同。

我想获取 LastMofified 日期不同的对象集。

{
  "AppCoreDetails": [
    {
      "ApplicationName": "APP_Config_V1",
      "LastModified": "2023-08-25 12:23:26"
    }
  ]
}

顺便说一句,我发现并尝试对此进行实验,但未能从简单字段转换为对象在此处输入链接描述

ansible jq
1个回答
0
投票

当您标记了 时,您可以使用

--slurp
(或
-s
)标志将两个结果读入数组,并将项目减少到相关值。然后使用
transpose
对齐它们,并使用
select
过滤差异。

jq -s '
  map(.AppCoreDetails) | transpose
  | {AppCoreDetails: map(select(first != last)[0])}
'

演示

这假设两种情况下的

.ApplicationName
值已经对齐,即数组具有相同数量的项目并且名称的顺序相同。如果情况不一定如此,请指定如何处理悬空匹配。以下是使用
JOIN
INDEX
查找匹配
.ApplicationName
值的方法:

jq -s 'map(.AppCoreDetails) | {AppCoreDetails: [JOIN(
  INDEX(last[]; .ApplicationName); first[]; .ApplicationName; select(first != last)[0]
)]}'

演示

给定两个样本输入,两者都接近输出

{
  "AppCoreDetails": [
    {
      "ApplicationName": "APP_Config_V1",
      "LastModified": "2023-08-25 12:23:26"
    }
  ]
}
© www.soinside.com 2019 - 2024. All rights reserved.