Ansible:将complexe字典转换为java属性

Ansible:将complexe字典转换为java属性,ansible,jinja2,Ansible,Jinja2,我想知道是否有一个简单的方法来转换这样一本字典 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

我想知道是否有一个简单的方法来转换这样一本字典

  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

可以使用自定义过滤器。比如说

$ 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
        }
    - set_fact:
        my_dict: "{{ {}|combine({'sql': sql}) }}"
    - debug:
        msg: "{{ my_dict|dict_flatten }}"
任务

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

在变量名称前面加上前缀以获得所需的输出。比如说

$ 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
        }
    - set_fact:
        my_dict: "{{ {}|combine({'sql': sql}) }}"
    - debug:
        msg: "{{ my_dict|dict_flatten }}"
给予


我最终直接使用了平面虚设,比如

properties:
  sql.alter_table: true
  sql.store.driver: = org.postgresql.Driver
  sql.store.url: jdbc:postgresql://localhost:5432/db
然后用听写2项在上面循环

- debug:
    msg: "{{ item.key }} = {{ item.value }}"
  loop: "{{ properties | dict2items }}"
我看到的唯一区别是,你必须像这样使用变量

properties['sql.store.url'] 
而不是

properties.sql.store.url

到目前为止你尝试了什么?谢谢,有趣的代码!但我觉得复杂度有点太高了。因此,我最终重新设计了角色,从一开始就使用了平面变量: