Dictionary ansible平坦贴图过滤器结果
我使用Ansible的映射过滤器来提取数据,但输出是一个列表列表;我需要的是一个扁平的列表。下面的“energy.yml”剧本说明了我最近的一次尝试。援引为Dictionary ansible平坦贴图过滤器结果,dictionary,ansible,jinja2,Dictionary,Ansible,Jinja2,我使用Ansible的映射过滤器来提取数据,但输出是一个列表列表;我需要的是一个扁平的列表。下面的“energy.yml”剧本说明了我最近的一次尝试。援引为 ansible剧本。/energy.yml--extra vars='src=solar' --- - hosts: localhost vars: region: [ 'east', 'west' ] sources: wind: east: filenames:
ansible剧本。/energy.yml--extra vars='src=solar'
---
- hosts: localhost
vars:
region: [ 'east', 'west' ]
sources:
wind:
east:
filenames:
- noreaster.txt
- gusts.txt
- drafty.txt
west:
filenames:
- zephyr.txt
- jetstream.txt
solar:
east:
filenames:
- sunny.txt
- cloudy.txt
west:
filenames:
- blazing.txt
- frybaby.txt
- skynuke.txt
src: wind
tasks:
- name: Do the {{ src }} data
debug:
msg: "tweak file '/energy/{{src}}/{{ item[0] }}/{{ item[1] }}'."
with_nested:
- "{{ region }}"
- "{{
(region|map('extract',sources[src],'filenames')|list)[0] +
(region|map('extract',sources[src],'filenames')|list)[1]
}}"
when: "item[1] in sources[src][item[0]].filenames"
map()过滤器的输出是许多与“region”长度相同的列表。Jinja的“+”操作符是我发现的唯一一种连接列表的机制,但是由于它是一个二进制操作符而不是一个过滤器,所以我不能将它应用于任意数量的列表。上面的代码取决于长度为2的“region”,而必须多次映射()是非常难看的
重组数据(或问题)不是一种选择。我想重点介绍的方面是展平map()输出,或者以其他方式生成正确的“msg:”行。上面的代码使用
start=[]
进行求和筛选,是您的朋友:
region | map('extract',sources[src],'filenames') | sum(start=[])
由此:
[
[
"noreaster.txt",
"gusts.txt",
"drafty.txt"
],
[
"zephyr.txt",
"jetstream.txt"
]
]
它将做到这一点:
[
"noreaster.txt",
"gusts.txt",
"drafty.txt",
"zephyr.txt",
"jetstream.txt"
]
这完美地解决了我的问题。我已经读过sum()的文章,但是sum()能够或将会做到这一点(至少对我来说是这样,现在仍然不是这样)一点也不明显。秘诀是
start=[]
–它强制sum将数组连接起来,而不是默认的整数。