Ansible-访问dict of dict of dict of dict
我有一个具有以下数据结构的外部数据文件:Ansible-访问dict of dict of dict of dict,ansible,yaml,ansible-2.x,Ansible,Yaml,Ansible 2.x,我有一个具有以下数据结构的外部数据文件: --- server1: service_name: jboss_prod_1: enabled: "True" started: "True" jboss_prod_2: enabled: "True" started: "True" jboss_prod_3: enabled: "True" started: "True" jboss_prod
---
server1:
service_name:
jboss_prod_1:
enabled: "True"
started: "True"
jboss_prod_2:
enabled: "True"
started: "True"
jboss_prod_3:
enabled: "True"
started: "True"
jboss_prod_4:
enabled: "False"
started: "False"
jboss_prod_5:
enabled: "False"
started: "False"
server2:
service_name:
jboss_prod_3:
enabled: "True"
started: "True"
jboss_prod_5:
enabled: "True"
started: "True"
jboss_prod_7:
enabled: "True"
started: "True"
jboss_prod_9:
enabled: "False"
started: "False"
jboss_prod_13:
enabled: "False"
started: "False"
我一直在试图找到一种方法,通过一个显示服务器名称、服务器上的服务以及它们的2个值enabled和start的输出来着手解决问题。到目前为止,我可以很好地进入第三层,但并不是一直到第四层,因为服务名称的值是未知的-我不能对它的值或顺序做出假设
这项工作:
---
- name: test creating a dictionary from external file
hosts: localhost
gather_facts: False
tasks:
- name: load the file
include_vars:
name: service_map
file: vars/service_map.yml
- name: SHOW ME THE MONEY!
loop: "{{ lookup('dict', service_map) }}"
debug:
msg: "{{item.value}}"
with_dict:
- "{{item.value.service_name}}"
并产生以下输出:
PLAY [test creating a dictionary from external file] **********************************************************************************************************************************************
TASK [load the file] ******************************************************************************************************************************************************************************
ok: [localhost]
TASK [SHOW ME THE MONEY!] *************************************************************************************************************************************************************************
ok: [localhost] => (item={'value': u'server1', 'key': u'key'}) => {
"msg": "server1"
}
ok: [localhost] => (item={'value': {u'service_name': {u'jboss_prod_2': {u'started': u'True', u'enabled': u'True'}, u'jboss_prod_3': {u'started': u'True', u'enabled': u'True'}, u'jboss_prod_1': {u'started': u'True', u'enabled': u'True'}, u'jboss_prod_4': {u'started': u'False', u'enabled': u'False'}, u'jboss_prod_5': {u'started': u'False', u'enabled': u'False'}}}, 'key': u'value'}) => {
"msg": {
"service_name": {
"jboss_prod_1": {
"enabled": "True",
"started": "True"
},
"jboss_prod_2": {
"enabled": "True",
"started": "True"
},
"jboss_prod_3": {
"enabled": "True",
"started": "True"
},
"jboss_prod_4": {
"enabled": "False",
"started": "False"
},
"jboss_prod_5": {
"enabled": "False",
"started": "False"
}
}
}
}
ok: [localhost] => (item={'value': u'server2', 'key': u'key'}) => {
"msg": "server2"
}
ok: [localhost] => (item={'value': {u'service_name': {u'jboss_prod_3': {u'started': u'True', u'enabled': u'True'}, u'jboss_prod_5': {u'started': u'True', u'enabled': u'True'}, u'jboss_prod_9': {u'started': u'False', u'enabled': u'False'}, u'jboss_prod_7': {u'started': u'True', u'enabled': u'True'}, u'jboss_prod_13': {u'started': u'False', u'enabled': u'False'}}}, 'key': u'value'}) => {
"msg": {
"service_name": {
"jboss_prod_13": {
"enabled": "False",
"started": "False"
},
"jboss_prod_3": {
"enabled": "True",
"started": "True"
},
"jboss_prod_5": {
"enabled": "True",
"started": "True"
},
"jboss_prod_7": {
"enabled": "True",
"started": "True"
},
"jboss_prod_9": {
"enabled": "False",
"started": "False"
}
}
}
}
PLAY RECAP ****************************************************************************************************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
但是我需要看看是否可以得到一些列出服务器、服务名称以及这两个状态的信息。希望这是足够的信息,有人可以帮助我。我对Ansible比较陌生,在复杂的数据结构上进行迭代简直要了我的命
Q:列出服务器、服务名称,然后列出两种状态
A:下面的任务就可以了
- set_fact:
service_map2: "{{ service_map2|default({})|
combine({item.key:
item.value.service_name}) }}"
loop: "{{ service_map|dict2items }}"
字典服务_map2列出服务器、服务名称,然后列出这两种状态
"service_map2": {
"server1": {
"jboss_prod_1": {
"enabled": "True",
"started": "True"
},
"jboss_prod_2": {
"enabled": "True",
"started": "True"
},
...
注释
1使用json_查询从字典中选择信息。比如说
列出未启用的服务
- set_fact:
result: "{{ result|default({})|
combine({item.key: item.value|dict2items|json_query(query)})
}}"
loop: "{{ service_map2|dict2items }}"
vars:
query: "[?value.enabled=='False'].key"
- debug:
var: result
给予
B列出已启动的服务
query: "[?value.started=='True'].key"
给予
C列出未启用的服务的服务器、服务名称和状态
query: "[?value.enabled=='False'].{service: key,
enabled: value.enabled,
started: value.started}"
给予
2下面的任务创建列表服务_map2而不是字典
- set_fact:
service_map2: "{{ service_map2|default([]) +
[{item.key:
item.value.service_name}] }}"
loop: "{{ service_map|dict2items }}"
3不需要创建服务映射2。原始数据服务映射可用于列出所选服务器、服务名称和2个状态
- set_fact:
result: "{{ result|default({})|
combine({item.key: item.value.service_name|
dict2items|
json_query(query)})
}}"
loop: "{{ service_map|dict2items }}"
vars:
query: "[ ...
"result": {
"server1": [
{
"enabled": "False",
"service": "jboss_prod_4",
"started": "False"
},
{
"enabled": "False",
"service": "jboss_prod_5",
"started": "False"
}
],
"server2": [
{
"enabled": "False",
"service": "jboss_prod_9",
"started": "False"
},
{
"enabled": "False",
"service": "jboss_prod_13",
"started": "False"
}
]
}
- set_fact:
service_map2: "{{ service_map2|default([]) +
[{item.key:
item.value.service_name}] }}"
loop: "{{ service_map|dict2items }}"
- set_fact:
result: "{{ result|default({})|
combine({item.key: item.value.service_name|
dict2items|
json_query(query)})
}}"
loop: "{{ service_map|dict2items }}"
vars:
query: "[ ...