2015-08-02 8 views
7

Chcę dodać klucze do słownika podczas używania set_fact with with_items. To jest mały POC, który pomoże mi wykonać jakąś inną pracę. Próbowałem uogólnić POC, aby usunąć wszystkie nieistotne szczegóły z niego.Ansible - Jak dodawać nowe klucze do słownika podczas korzystania z set_fact module with with_items?

Po wykonaniu poniższego kodu wyświetla słownik zawierający tylko jeden klucz, który odpowiada ostatniemu elementowi with_items. Wygląda na to, że odtwarza on nowy słownik lub może przesłonić istniejący słownik dla każdego elementu w parametrach with_items. Chcę mieć pojedynczy słownik ze wszystkimi kluczami.

Kod:

--- 
- hosts: localhost 
    connection: local 
    vars: 
     some_value: 12345 
     dict: {} 
    tasks: 
    - set_fact: { 
      dict: "{ 
      {{ item }}: {{ some_value }} 
      }" 
      } 
     with_items: 
      - 1 
      - 2 
      - 3 
    - debug: msg="{{ dict }}" 

Odpowiedz

3

Użyj filter plugin.

Najpierw zrób nowy plik w bazie danych ansib o nazwie filter_plugins/makedict.py.

Teraz utwórz nową funkcję o nazwie "makedict" (lub cokolwiek chcesz), która pobiera wartość i listę i zwraca nowy słownik, w którym klucze są elementami listy, a wartość jest zawsze taka sama.

class FilterModule(object): 
    def filters(self): 
     return { 'makedict': lambda _val, _list: { k: _val for k in _list } } 

Teraz można korzystać z nowego filtra w playbook, aby osiągnąć pożądany rezultat:

- hosts: 127.0.0.1 
    connection: local 
    vars: 
     my_value: 12345 
     my_keys: [1, 2, 3] 
    tasks: 
    - set_fact: my_dict="{{ my_value | makedict(my_keys) }}" 
    - debug: msg="{{ item.key }}={{ item.value }}" 
     with_dict: "{{my_dict}}" 

Można customize the location z wtyczki filtr używając opcji filter_plugins w ansible.cfg.

8

Można to również zrobić bez korzystania z wtyczek, testowanych w Ansible 2.2.

--- 
- hosts: localhost 
    connection: local 
    vars: 
    some_value: 12345 
    dict: {} 
    tasks: 
    - set_fact: 
     dict: "{{ dict | combine({ item: some_value }) }}" 
    with_items: 
     - 1 
     - 2 
     - 3 
    - debug: msg="{{ dict }}" 

Alternatywnie można to zapisać bez złożonego jedno-liniowego z plikiem włączającym.

tasks: 
    - include: append_dict.yml 
    with_items: [1, 2, 3] 

append_dict.yml:

- name: "Append dict: define helper variable" 
    set_fact: 
    _append_dict: "{ '{{ item }}': {{ some_value }} }" 

- name: "Append dict: execute append" 
    set_fact: 
    dict: "{{ dict | combine(_append_dict) }}" 

wyjściowa:

TASK [debug] 
******************************************************************* 
ok: [localhost] => { 
    "msg": { 
     "1": "12345", 
     "2": "12345", 
     "3": "12345" 
    } 
} 

Pojedyncze cudzysłowy ' wokół {{ some_value }} są potrzebne do przechowywania wartości łańcuchowych wyraźnie.

Składnia ta może być również stosowana do dołączania z dict elementwise wykorzystaniem with_dict odwołując się do item.key i item.value.

Manipulacje jak dodawanie przed i postfixes lub sieka mogą być wykonywane w tym samym etapie, na przykład

set_fact: 
     dict: "{{ dict | combine({ item.key + key_postfix: item.value + '_' + item.value | hash('md5') }) }}" 
Powiązane problemy