从ansible列表中获取最新字典

时间:2020-02-21 13:08:43

标签: ansible jinja2

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

正在查看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 :(得分:0)

正在查看jinja2文档,看来我应该能够做到这一点...

尽管jinja2 builtin filters documentation提到了max过滤器的可能参数,但在可行的方面还是有一个open bug report支持这些参数。

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