在 Jinja2 中访问嵌套字典和列表中的项目

时间:2021-03-23 22:36:34

标签: jinja2

数据:

primaries:
  ca:
    - 10.51.60.45 
    - 10.51.60.46 
  ny:
    - 10.52.60.45 
    - 10.52.60.46
  az:
    - 10.53.60.45
    - 10.53.60.46

我想要一个所有 IP 的扁平化列表(或一个可以只遍历 IP 的 for 循环),但城市 canyaz 可以是任何东西。< /p>

3 个答案:

答案 0 :(得分:1)

Ansible 的 extract filter 从容器中提取键的值,使这变得非常简单。

{{ primaries | map('extract', primaries) | flatten }}

也可以直接使用字典的 values() 方法,灵活性稍差(extract 方法允许您预先过滤键,而这里不能这样做。)

{{ primaries.values() | flatten }}

答案 1 :(得分:0)

您只需要遍历字典的键即可。

{% for region, ips in primaries.items() %}
  {% for ip in ips %}
    {{ ip }}
  {% endfor %}
{% endfor %}

阅读 for 上的 Jinja 文档。

答案 2 :(得分:0)

使用 Ansible,您可以使用 json_query 过滤器获得扁平化的 ip 列表:

List of ip addresses:
{% for addr in primaries|json_query('*[][]') %}
- {{ addr }}
{% endfor %}

结果:

List of ip addresses:
- 10.51.60.45
- 10.51.60.46
- 10.52.60.45
- 10.52.60.46
- 10.53.60.45
- 10.53.60.46

这是一个可运行的示例:

- hosts: localhost
  gather_facts: false
  vars:
    primaries:
      ca:
        - 10.51.60.45 
        - 10.51.60.46 
      ny:
        - 10.52.60.45 
        - 10.52.60.46
      az:
        - 10.53.60.45
        - 10.53.60.46
  tasks:
    - copy:
        dest:  addresses.txt
        content: |
          List of ip addresses:
          {% for addr in primaries|json_query('*[][]') %}
          - {{ addr }}
          {% endfor %}

json_query 过滤器使用 JMESPath query language