2015-08-07 20 views
13

Mein grundlegendes Problem ist, dass bei der Erstellung einer Reihe von AWS-Servern ich möchte sie konfigurieren, um voneinander zu wissen.Ist es möglich Listen mit Ansible/Jinja2 zu plätten?

Nach der Erstellung jedes Servers werden ihre Daten in einer registrierten "Server" -Var gespeichert (siehe unten). Was ich möchte in der Lage zu tun, wirklich nach der Erstellung einer Aufgabe wie so ausgeführt wird:

- name: Add servers details to all other servers 
    lineinfile: 
    dest: /path/to/configfile 
    line: "servername={{ item.1.private_ip }}" 
    delegate_to: "{{ item.0.public_dns_name }}" 
    with_nested: 
    - list_of_servers 
    - list_of_servers 

Versorgung der Liste zweimal zu ‚with_nested‘ ist hier unerlässlich.

eine Liste der Liste zu bekommen ist leicht genug, um mit dem zu tun:

"{{ servers.results | map(attribute='tagged_instances') | list }}" 

, die zurückgibt:

[ 
    [ { "private_ip": "ip1", "public_dns_name": "dns1" } , { ... }], 
    [ { ... }, { ... } ] 
] 

aber wie würden Sie diese in drehen:

[ 
    { "private_ip": "ip1", "public_dns_name": "dns1" }, 
    { ... }, 
    { ... }, 
    { ... } 
] 

Die ' Die registrierte Var des Servers sieht so aus:

"servers": { 
    "changed": true, 
    "msg": "All items completed", 
    "results": [ 
     { 
      ... 
      "tagged_instances": [ 
       { 
        ... 
        "private_ip": "ip1", 
        "public_dns_name": "dns1", 
        ... 
       }, 
       { 
        ... 
        "private_ip": "ip2", 
        "public_dns_name": "dns2", 
        ... 
       } 
      ] 
     }, 
     { 
      ... 
      "tagged_instances": [ 
       { 
        ... 
        "private_ip": "ip3", 
        "public_dns_name": "dn3", 
        ... 
       }, 
       { 
        ... 
        "private_ip": "ip4", 
        "public_dns_name": "dns4", 
        ... 
       } 
      ] 
     }, 
     ... 
    ] 
} 

Hinweis: Ich habe eine ziemlich hässliche Lösung, indem ich 'with_flattened' und eine Debug-Anweisung verwende, um eine neue registrierte var 'flattened_servers' zu erstellen, die ich dann erneut abbilde. Aber ich hoffe auf eine elegantere Lösung :)

Antwort

2

Sie können Liste Verständnis tun, um es in eine Liste von Diktaten zu konvertieren.

Zum Beispiel:

- name: Convert 
    shell: python -c "print [x for b in {{ servers }}['servers']['results'] for x in b['tagged_instances']]" 
    register: my_list_of_dicts 

Unter der Annahme, dass {{ servers }} Variable das gesamte Wörterbuch hält (nicht json).

+0

Dies ist definitiv eine große Verbesserung der laufenden Schleifen in Yml! Wird sehen, ob jemand weiß, wie man ein Listenverständnis in jinja2 macht. Ansonsten ist dies wahrscheinlich die Antwort. – TomDotTom

+0

Jinja unterstützt offiziell keine List Comprehensions oder andere "fortgeschrittene" Python-Operationen: http://jinja.pocoo.org/docs/dev/faq/#isn-t-it-a-terrible-idea-to-put- Logik-in-Vorlagen. Ich habe "Jinja2 Listenverständnis" zu oft gegoogelt, um es zu vergessen. :( – thankyour

0

Ich wollte nur die „hässlich“ Problemumgehung als Python-Code zur Liste nicht für mich arbeiten

- debug: var=item 
    with_flattened: 
     - "{{ servers.results|map(attribute='tagged_instances')|list }}" 
    register: servers_instances_tmp 
    no_log: True 

    - set_fact: servers_instances="{{ servers_instances_tmp.results|map(attribute='item')|list }}" 

    - debug: var=servers_instances 
29

Jinja2 mit einem sum eingebauten Filter kommt, die wie verwendet werden kann:

{{ servers.results | sum(attribute='tagged_instances', start=[]) }} 
+2

Wenn Sie alle Instanzen-IDs benötigen, können Sie das obige Beispiel folgendermaßen erweitern: 'code' - set_fact: instance_ids =" {{servers.results | sum (attribute = 'tagged_instances', start = []) | map (attribute = 'id') | list}} " – etrubenok

+1

Ich fand, dass dies der" ansible "-Antwort ist und es hat gut funktioniert. – xenithorb

+1

Dies funktionierte auch auf einem Array von Arrays! Meine Daten sahen aus wie' [[1, 2], [3, 4]] 'und mit' | sum (start = []) 'flachte es zu' [1, 2, 3, 4] '. Vielen Dank - hätte das nie herausgefunden. –

Verwandte Themen