数据:
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 循环),但城市 ca
和 ny
和 az
可以是任何东西。< /p>
答案 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。