Ansible редактировать массив объектов json на месте или сортировать по разным значениям, когда не определено

#ansible #jinja2

#ansible #jinja2

Вопрос:

У меня есть список объектов 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 , и если lastTimestamp он не был определен eventTime . Поскольку это не работает с sort — по крайней мере, насколько мне известно, я думал о манипулировании массивом, установив lastTimestamp значение eventTime when lastTimestamp равно null .

Поскольку я новичок в Ansible, я не уверен, как управлять списком на месте, чтобы архивировать мою цель. Или есть даже способ сортировки по двум атрибутам?

Ответ №1:

Вкратце, вы не редактируете на месте в ansible. Вы манипулируете данными для создания новой структуры данных, адаптированной к вашим потребностям

В вашем конкретном случае я не думаю, что есть какой-либо другой способ, кроме использования set_fact и перебора ваших исходных данных для проверки каждого элемента (т. Е. Я не вижу решения, просто применяя серию фильтров к исходным данным).

Новые элементы в вашем новом списке будут получены путем объединения исходного dict с dict, содержащим правильную дату или пустой, чтобы сохранить текущую дату.

Вот краткий пример сборника:

 ---
- 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