首页 > 解决方案 > 如何使 jinja2 生成器理解在 ansible 中工作?

问题描述

我有一个嵌套字典的列表。我想使用 jinja2 生成器理解从中创建一个列表。

test_nested_dict_list:
  - foo:
    a:
      x: 1
      y: 2
    b: 2
  - bar:
    a:
      x: 2
      y: 4
    b: 4

- debug:
    msg: "{{(u.b for u in test_nested_dict_list if u.a.x == 1 ) | list}}"

这会导致错误:{"msg": "template error while templating string: expected token ')', got 'for'. String: {{(u.b for u in test_nested_dict_list if u.a.x == 1 ) | list}}"}

标签: ansiblejinja2

解决方案


JMESPath,过滤器使用的 JSON 查询语言json_query是一种非常强大的语言,可以帮助您实现这样的事情。

实际上,文档中的一个示例看起来非常像您想要实现的目标。

因此,整个逻辑只是基于查询语言查找嵌套数据以选择节点的能力。
所以,这个语法:[?a.x==`1`].b相当于一个逻辑,比如find all subelement having a.x == 1,然后让我b摆脱它

鉴于剧本:

- hosts: localhost
  gather_facts: no
  vars:
    test_nested_dict_list:
      - foo:
        a:
          x: 1
          y: 2
        b: 2
      - bar:
        a:
          x: 2
          y: 4
        b: 4

  tasks:
    - debug: 
        msg: "{{ test_nested_dict_list | json_query('[?a.x==`1`].b') | list }}"

它给出了回顾:

PLAY [localhost] *****************************************************************************************************************

TASK [debug] *********************************************************************************************************************
ok: [localhost] => {
    "msg": [
        2
    ]
}

PLAY RECAP ***********************************************************************************************************************
localhost  

推荐阅读