我使用 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"
}
]
}
顺便说一句,我发现并尝试对此进行实验,但未能从简单字段转换为对象在此处输入链接描述
当您标记了 jq 时,您可以使用
--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"
}
]
}