首页 > 解决方案 > 从 ansible 的列表中获取最新的字典

问题描述

我有一个字典列表,我想获得最新的。

查看 jinja2 文档似乎我应该能够做到这一点:

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


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

但这失败了

致命的:[本地主机]:失败!=> { "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 帐户的所有自动缩放。我过滤它们,我想根据名称或任何其他参数获取最新的。我有点呆在这里。

标签: ansiblejinja2

解决方案


更新:正如下面@Hellseher 评论中所报告的,从ansible 2.11版本开始,max|min(attribute='someattr')将可用。因此,对于此版本及以后的版本,以下答案将过时。请参阅相应的拉取请求


审查 jinja2 文档似乎我应该能够做到这一点......

尽管jinja2 内置过滤器文档提到了max过滤器的可能参数,但在 ansible 端有一个开放的错误报告来支持这些。

json_query在这种情况下,您可以使用过滤器轻松实现您的要求。这是一个包含您的简单数据的演示手册(因为我没有您更详细的数据......)。您可能可以将其调整为您的实际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)') }}"

推荐阅读