ansible展平地图过滤结果

时间:2017-05-12 12:34:24

标签: dictionary ansible jinja2

我正在使用Ansible的地图过滤器来提取数据,但输出是一个列表列表;我需要的是一个扁平的清单。我最接近的是下面的“energy.yml”剧本。调用为

ansible-playbook ./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()才是极端的丑陋。

重组数据(或问题)不是一种选择。我想关注的方面是展平map()输出,或者生成正确的“msg:”行的其他方式上面的代码

1 个答案:

答案 0 :(得分:4)

带有sum

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"
]