I have an external data file with the following data structure:
---
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"
I've been trying to find a way to get down to something with an output that shows the server name, services on it and their 2 values of enabled and started. So far, I can get at the 3rd layer pretty well, but not all the way to the 4th, since the "service name" value is unknown -- i cannot make assumptions as to it's value or order.
This works:
---
- 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}}"
and produces this output:
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
But I need to see if I can get something that lists the server, the service name and then the 2 states. Hopefully that's enough info that someone can help me out. I'm comparatively new to Ansible and iterating over complex data structures is killing me.