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