2016-07-01 17 views
7

Staram się kurczyć kilka kawałków podobnego kodu, który wygląda tak:Set fakt z dynamicznym nazwy klucza w ansibla

- ... multiple things is going here 
    register: list_register 
- name: Generating list 
    set_fact: my_list="{{ list_register.results | map(attribute='ansible_facts.list_item') | list }}" 

# the same code repeats... 

w rzeczywistości, jedyną różnicą pomiędzy nimi jest to, że używam różnych nazw list tutaj zamiast od my_list

w rzeczywistości chcę to zrobić:

set_fact: 
    "{{ some var }}" : "{{ some value }}" 

natknąłem this post ale nie znalazł żadnej odpowiedzi tutaj.

Czy jest to możliwe, czy istnieje jakieś obejście tego problemu?

Odpowiedz

11

przyjrzeć się tej próbki Playbook:

--- 
- hosts: localhost 
    vars: 
    iter: 
     - key: abc 
     val: xyz 
     - key: efg 
     val: uvw 
    tasks: 
    - set_fact: {"{{ item.key }}":"{{ item.val }}"} 
     with_items: "{{iter}}" 
    - debug: msg="key={{item.key}}, hostvar={{hostvars['localhost'][item.key]}}" 
     with_items: "{{iter}}" 
+1

W rzeczywistości, uproszczona odpowiedź byłaby 'set_fact: { "{{key}}": "{{val}}"}' –

+0

Dzięki za pomysł, mam dookoła za pomocą listy słowniki '[{key: var1, val: val1}, {key: var2, val: val2}]' zamiast pojedynczego słownika '{var1: val1, var2: val2}'. – haridsv

2

Powyższe nie działa dla mnie. To, co w końcu działa, to:

Co jest w końcu oczywiste. Konstruujesz ciąg znaków (zewnętrzne podwójne cudzysłowy), który jest interpretowany jako skrót. W hasłach klucz i wartość muszą być pojedynczymi cudzysłowami (wewnętrzne pojedyncze cudzysłowy wokół zmiennych zastępczych). I w końcu po prostu umieść zmienne zamienniki, tak jak w każdym innym ciągu.

Stefan

+0

Tutaj, 'example_dict' kończy się ciągiem, a nie słownikiem. – haridsv

+0

Musiałem to zdefiniować w ten sposób, w otoczeniu podwójnych cudzysłowów, z ansible 2.3.2.0. Nie kończyło się to na łańcuchu, wydrukowanie go za pomocą 'debug:' pokazało, że ma poprawną strukturę słownika. – Matthew