Ansible在位编辑json对象数组,或在未定义时对不同的值进行排序

Ansible在位编辑json对象数组,或在未定义时对不同的值进行排序,ansible,jinja2,Ansible,Jinja2,我有一个json对象列表,看起来像这样 [ { "apiVersion": "v1", "count": 11, "eventTime": null, "firstTimestamp": "2020-10-20T16:17:08Z", "lastTimestamp": "2020-10-20T16:30:

我有一个json对象列表,看起来像这样

[
  {
    "apiVersion": "v1",
    "count": 11,
    "eventTime": null,
    "firstTimestamp": "2020-10-20T16:17:08Z",
    "lastTimestamp": "2020-10-20T16:30:38Z",
    "involvedObject": {
        "apiVersion": "v1"
    },
    "kind": "Event"
  },
  {
    "apiVersion": "v1",
    "count": 11,
    "eventTime": "2020-10-20T16:17:10.182317Z"
    "firstTimestamp": null,
    "lastTimestamp": null,
    "involvedObject": {
        "apiVersion": "v1"
    },
    "kind": "Event"
  }
]
如果
eventTime
未定义
lastTimestamp
,我希望能够按照
lastTimestamp
对该数组进行排序。由于这不适用于
排序
——至少据我所知,我正在考虑操纵数组,当
lastTimestamp
为空时,将
lastTimestamp
设置为
eventTime


由于我是Ansible的新手,我不知道如何操作一个列表来归档我的目标。或者甚至有一种方法可以按两个属性进行排序吗?

简单地说,您不需要在ansible中就地编辑。您可以操纵数据以创建适合您需要的新数据结构

在您的具体案例中,我认为除了使用
set\u fact
并在原始数据上循环检查每个项目之外,没有任何其他方法(即,我看不到简单地对原始数据应用一系列过滤器的解决方案)

新列表中的新项目将通过将原始dict与包含正确日期的dict或空dict组合来获得,以保留当前日期

下面是一个快速示例剧本:

---
-名称:处理日期和排序
主机:本地主机
收集事实:错误
变量:
#将原始数据作为json显示在一行上,以缩短显示时间
api_事件:[{“apiVersion”:“v1”,“count”:11,“eventTime”:null,“firstTimestamp”:“2020-10-20T16:17:08Z”,“lastTimestamp”:“2020-10-20T16:30:38Z”,“involvedObject”:“{”apiVersion:“v1”;“种类”:“Event”},{“apiVersion”:“v1”,“count”:11,“eventTime”:“2020-10-20T16:17:10.182317Z”,“firstTimestamp”:null,“lastTimestamp”:null,“involvedObject”:{“apiVersion”:“v1”},“种类”:“事件”}]
任务:
-名称:处理API事件以确定我们将使用的时间
变量:
新的时间戳:{{item.firstTimestamp}三元({},{'firstTimestamp':item.eventTime}}}
当前_事件:{{item}合并(新的_时间戳)}”
设定事实:
已处理的_api_事件:{{已处理的_api_事件|默认([])+[current_event]}
循环:“{api_事件}}”
-名称:显示已排序的结果
调试:
msg:{{processed_api_events}排序(attribute='firstTimestamp')}
其中:

PLAY [Process date and sort] ***********************************************************************************************************************************************************************************************************

TASK [Process API events to determine time we will use] ********************************************************************************************************************************************************************************
ok: [localhost] => (item={'apiVersion': 'v1', 'count': 11, 'eventTime': None, 'firstTimestamp': '2020-10-20T16:17:08Z', 'lastTimestamp': '2020-10-20T16:30:38Z', 'involvedObject': {'apiVersion': 'v1'}, 'kind': 'Event'})
ok: [localhost] => (item={'apiVersion': 'v1', 'count': 11, 'eventTime': '2020-10-20T16:17:10.182317Z', 'firstTimestamp': None, 'lastTimestamp': None, 'involvedObject': {'apiVersion': 'v1'}, 'kind': 'Event'})

TASK [Show result sorted] **************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        {
            "apiVersion": "v1",
            "count": 11,
            "eventTime": null,
            "firstTimestamp": "2020-10-20T16:17:08Z",
            "involvedObject": {
                "apiVersion": "v1"
            },
            "kind": "Event",
            "lastTimestamp": "2020-10-20T16:30:38Z"
        },
        {
            "apiVersion": "v1",
            "count": 11,
            "eventTime": "2020-10-20T16:17:10.182317Z",
            "firstTimestamp": "2020-10-20T16:17:10.182317Z",
            "involvedObject": {
                "apiVersion": "v1"
            },
            "kind": "Event",
            "lastTimestamp": null
        }
    ]
}

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0