2015-02-09 5 views
6

I Wörterbuch-Art von Daten, die ich durchlaufen will und die Ordnung zu halten ist wichtig:Wie erzwinge die Reihenfolge von with_dict in Ansible?

with_dict_test: 
    one: 1 
    two: 2 
    three: 3 
    four: 4 
    five: 5 
    six: 6 

Nun, wenn ich eine Aufgabe schreibe die Schlüssel und Werte zu drucken, werden sie in scheinbar zufälliger Reihenfolge gedruckt (6, 3, 1, 4, 5, 2).

--- 
- name: with_dict test 
    debug: msg="{{item.key}} --> {{item.value}}" 
    with_dict: with_dict_test 

Wie kann ich Ansible erzwingen, in der angegebenen Reihenfolge zu iterieren? Oder ist etwas besser geeignet als with_dict? Ich brauche wirklich sowohl den Schlüssel als auch den Wert während der Ausführung der Aufgabe ...

Antwort

7

Ich sehe keine einfache Möglichkeit, dicts zu verwenden, da sie dort Reihenfolge aus der Reihenfolge seiner Hash-Schlüssel bestimmen.
Sie können im Anschluss an die tun:

with_dict_test: 
    - { key: 'one', value: 1 } 
    - { key: 'two', value: 2 } 
    - { key: 'three', value: 3 } 
    - { key: 'four', value: 4 } 
    - { key: 'five', value: 5 } 
    - { key: 'six', value: 6 } 

und im Textbuch nur with_dict ersetzen mit with_items:

--- 
- name: with_dict test 
    debug: msg="{{item.key}} --> {{item.value}}" 
    with_items: with_dict_test 

Wenn Sie diese Lösung finden (die Deklaration der Variablen) zu hässlich, können Sie tun dies:

key: ['one', 'two', 'three', 'four', 'five', 'six'] 
values: [1, 2, 3, 4, 5, 6] 

und im Textbuch

--- 
- name: with_dict test 
    debug: msg="{{item.0}} --> {{item.1}}" 
    with_together: 
    - key 
    - value 
+0

Danke für die Info. Ich wusste nicht, dass die Reihenfolge durch die Hash-Tasten gegeben ist. Ist das irgendwo dokumentiert? – dokaspar

+0

Das gesamte Playbook ist ein Yaml-Dokument. Sehen Sie sich http://pyyaml.org/wiki/PyYAMLDocumentation an, um zu sehen, wie es in Python-Objekte geparst wird. –

2

Ich bin nicht ganz sicher, aber vielleicht wird diese Ihnen auf dem Weg helfen:

- hosts: localhost 
    vars: 
     dict: 
     one: 1 
     two: 2 
     three: 3 
     sorted: "{{ dict|dictsort(false,'value') }}" 

    tasks: 
     - debug: 
      var: sorted 
     - debug: 
      msg: "good {{item.1}}" 
     with_items: sorted 

Ich gehe davon aus Sie den Jinja Filter verwenden können, um irgendwie Art auf komplexe Werte. Eine andere Sache, die Sie ausprobieren können, ist die Kombination dict.values()|list und with_sequence, aber alles, was Sie aus diesem Stein heraus melken, wird nicht gerade "wartbar" schreien.

+0

Interessanter Ansatz. Allerdings ist mein Beispiel 'with_dict_test' nur zur Veranschaulichung. In Wirklichkeit möchte ich, dass die Einträge nach der angegebenen Reihenfolge in der Datei sortiert werden, weder nach Schlüsseln noch nach Werten. – dokaspar

+0

@dokaspar Tut mir leid - aus irgendeinem Grund habe ich angenommen, dass Sie sich mit einem Diktat beschäftigen müssen (zB registrierte Variable von einer anderen Aufgabe) –

Verwandte Themen