2017-05-12 6 views
1

Ich verwende Ansible-Map-Filter, um Daten zu extrahieren, aber die Ausgabe ist eine Liste von Listen; Was ich brauche, ist eine abgeflachte Liste. Der nächste, den ich je gesehen habe, ist in dem folgenden "energy.yml" -Spielbuch dargestellt. Invoke alsansible abgeflacht map filter Ergebnisse

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" 

Die Ausgabe der Karte (Filter) eine Anzahl von Listen die gleiche Länge wie "Region" ist. Jinjas "+" - Operator ist der einzige Mechanismus, den ich gefunden habe, um Listen beizutreten, aber da es sich um einen binären Operator und nicht um einen Filter handelt, kann ich ihn nicht auf eine beliebige Anzahl von Listen anwenden. Der obige Code hängt von der "Region" ab, die die Länge 2 hat, und das mehrfache Abbilden() ist extrem hässlich.

Die Umstrukturierung der Daten (oder des Problems) ist keine Option. Der Aspekt möchte ich darauf konzentrieren, ist die Karte() -Ausgabe Abflachen oder eine andere Art und Weise, die richtigen zu generieren „msg:“ Linien der Code oben tut

Antwort

3

sum Filter mit start=[] ist dein Freund:

region | map('extract',sources[src],'filenames') | sum(start=[]) 

Daraus:

[ 
    [ 
     "noreaster.txt", 
     "gusts.txt", 
     "drafty.txt" 
    ], 
    [ 
     "zephyr.txt", 
     "jetstream.txt" 
    ] 
] 

Es wird dies tun:

[ 
    "noreaster.txt", 
    "gusts.txt", 
    "drafty.txt", 
    "zephyr.txt", 
    "jetstream.txt" 
] 
+0

Das perfekt so Ich habe mein Problem gelöst. Ich hatte die [docs] (http://jinja.pocoo.org/docs/2.9/templates/#sum) auf sum() gelesen, aber es war überhaupt nicht offensichtlich (zumindest für mich und immer noch nicht t) diese Summe() könnte oder würde dies tun. –

+2

Das Geheimnis ist 'start = []' - es zwingt sum, Arrays anstelle von Standard-Ganzzahlen zu verketten. –