Получить новейший словарь из списка в ansible - PullRequest
1 голос
/ 21 февраля 2020

У меня есть список словарей, и я хочу получить самый последний.

Просмотр документации jinja2 кажется, что я должен быть в состоянии сделать это:

    - set_fact:
    t:
      - a: 1
        b: 2
      - a: 3
        b: 1


- debug:
    msg: "{{ t | max(attribute='a') }}" 

Но это не удается с

смертельно: [localhost]: НЕ УДАЛЕНО! => {"msg": "Произошла непредвиденная ошибка типа шаблона ({{t | max (attribute = 'a')}}): max ()> получил неожиданный аргумент ключевого слова 'attribute'"}

Как лучше всего это сделать? Конечно, мой вариант использования сложнее, чем это маленькое демо. Мое мышление выглядит примерно так:

 check_mode: no
  set_fact:
    tgs_info: "{{ tgs_info | default({}) | combine({ item: all_tg_info | to_json | from_json | json_query(query) | max(attribute='target_group_name') }) }}"
  vars:
    query: "target_groups[?contains(target_group_name, `{{ product }}`) == `true`] | [?ends_with(target_group_name, `{{ tg_suffix }}{{ item }}`) == `true`]"
  loop: "{{ projects | selectattr('protocol', 'match', '^HTTP$') | map(attribute='port') | list }}"

Идея состоит в том, что all_tg_info содержит все автоматическое масштабирование моего aws аккаунта. Я отфильтрую их и хочу получить последнюю версию на основе имени или любого другого параметра. Я застрял здесь.

1 Ответ

0 голосов
/ 21 февраля 2020

при просмотре документации jinja2 кажется, что я смогу сделать это ...

Хотя документация по встроенным фильтрам jinja2 упоминает возможные параметры для max фильтр, существует открытый отчет об ошибках на стороне ansible для их поддержки.

В этом случае вы можете легко достичь своих требований с помощью фильтра json_query . Вот демонстрационная книга с вашими упрощенными данными c (поскольку у меня нет более сложной ...). Вы, вероятно, можете адаптировать это к вашей фактической json_query.

---
- hosts: localhost
  gather_facts: false

  vars:
    t:
      - a: 1
        b: 2
      - a: 3
        b: 1

  tasks:
    - debug:
        msg: "{{ t | json_query('max_by(@, &a)') }}"
...