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

Ansible edit array of json objects in place or sort for different values when undefined

我有一个包含 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"
  }
]

如果 lastTimestamp 未由 eventTime 定义,我希望能够按 lastTimestamp 对这个数组进行排序。由于这不适用于 sort - 至少据我所知,我正在考虑操纵数组,当 lastTimestamp 为空时将 lastTimestamp 设置为 eventTime

由于我是 Ansible 的新手,我不确定如何操作一个列表来实现我的目标。或者有没有办法按两个属性排序?

简而言之,您没有在 ansible 中就地编辑。您操纵数据以创建适合您需要的新数据结构

在你的具体情况下,我认为除了使用 set_fact 并循环遍历你的原始数据来检查每个项目之外没有任何其他方法(即我没有通过简单地应用一个解决方案原始数据上的一系列过滤器)。

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

这是一个简单的示例剧本:

---
- name: Process date and sort
  hosts: localhost
  gather_facts: false

  vars:
    # Your original data as json on a single line to shorten display
    api_events: [{"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"}]

  tasks:
    - name: Process API events to determine time we will use
      vars:
        new_timestamp: "{{ item.firstTimestamp | ternary({}, {'firstTimestamp': item.eventTime}) }}"
        current_event: "{{ item | combine(new_timestamp) }}"
      set_fact:
        processed_api_events: "{{ processed_api_events | default([]) + [current_event] }}"
      loop: "{{ api_events }}"

    - name: Show result sorted
      debug:
        msg: "{{ processed_api_events | sort(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