Ansible: преобразовать сложный словарь в java свойства - PullRequest
0 голосов
/ 29 января 2020

Мне интересно, есть ли простой способ преобразовать такой словарь

  sql:
    alter_table: true
    store:
      driver: org.postgresql.Driver
      url: jdbc:postgresql://localhost:5432/db

в подобные свойства

sql.alter_table = true
sql.store.driver = org.postgresql.Driver
sql.store.url = jdbc:postgresql://localhost:5432/db

Ответы [ 2 ]

1 голос
/ 29 января 2020

Можно использовать пользовательский фильтр. Например,

$ cat filter_plugins/dict_utils.py
def dict_flatten(d, separator='.'):
    out = {}
    def flatten(x, name=''):
        if type(x) is dict:
            for a in x:
                flatten(x[a], name + a + separator)
        elif type(x) is list:
            i = 0
            for a in x:
                flatten(a, name + str(i) + separator)
                i += 1
        else:
            out[name[:-1]] = x
    flatten(d)
    return out

class FilterModule(object):
    def filters(self):
        return {
            'dict_flatten': dict_flatten
        }

Задача

    - debug:
        msg: "{{ sql|dict_flatten }}"

дает

    "msg": {
        "alter_table": true, 
        "store.driver": "org.postgresql.Driver", 
        "store.url": "jdbc:postgresql://localhost:5432/db"
    }

Предварительно добавьте имя переменной, чтобы получить требуемый вывод. Например

    - set_fact:
        my_dict: "{{ {}|combine({'sql': sql}) }}"
    - debug:
        msg: "{{ my_dict|dict_flatten }}"

дать

    "msg": {
        "sql.alter_table": true, 
        "sql.store.driver": "org.postgresql.Driver", 
        "sql.store.url": "jdbc:postgresql://localhost:5432/db"
    }
0 голосов
/ 30 января 2020

В итоге я использовал прямые плоские переменные типа

properties:
  sql.alter_table: true
  sql.store.driver: = org.postgresql.Driver
  sql.store.url: jdbc:postgresql://localhost:5432/db

, а затем перебрал их с помощью dict2items

- debug:
    msg: "{{ item.key }} = {{ item.value }}"
  loop: "{{ properties | dict2items }}"

Единственное отличие, которое я вижу, это то, что вы должны использовать переменную вот так

properties['sql.store.url'] 

вместо

properties.sql.store.url
...