#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