Below is my json file where i have log array inside server array which is inside domain array.
[
{
“?xml”: {
“attributes”: {
“encoding”: “UTF-8”,
“version”: “1.0”
}
}
},
{
“domain”: [
{
“name”: “mydom”
},
{
“domain-version”: “12.2.1.3.0”
},
{
“server”: [
{
“name”: “AdminServer”
},
{
“ssl”: {
“name”: “AdminServer”
}
},
{
“listen-port”: “12400”
},
{
“listen-address”: “mydom.host1.bank.com”
}
]
},
{
“server”: [
{
“name”: “myserv1”
},
{
“ssl”: [
{
“name”: “myserv1”
},
{
“login-timeout-millis”: “25000”
}
]
},
{
“log”: [
{
“name”: “myserv1”
},
{
“file-name”: “/web/bea_logs/domains/mydom/myserv1/myserv1.log”
}
]
}
]
},
{
“server”: [
{
“name”: “myserv2”
},
{
“ssl”: {
“name”: “myserv2”
}
},
{
“reverse-dns-allowed”: “false”
},
{
“log”: [
{
“name”: “myserv2”
},
{
“file-name”: “/web/bea_logs/domains/mydom/myserv2/myserv2.log”
}
]
}
]
}
]
}
]
I have three conditions to meet.
- server may not always be the 3rd key of domain array.
- log may not always be the 2nd key of server array.
- log may not always be an element of server array.
I wish to grab the output as below:
myserv1_log: “/web/bea_logs/domains/mydom/myserv1/myserv1.log”
myserv2_log: “/web/bea_logs/domains/mydom/myserv2/myserv2.log”
Below is a proposed solution that works on ansible version 2.12.
- hosts: localhost
gather_facts: no
vars:
json: “{{ lookup(‘file’, ‘./file.json’) | from_json }}”
tasks: - name: display
debug:
msg: “{{ server.0.name }} → {{ filename.0.log[1][‘file-name’] }}”
loop: “{{ json[1].domain }}”
vars:
server: “{{ item.server | selectattr(‘name’, ‘defined’) }}”
filename: “{{ item.server | selectattr(‘log’, ‘defined’) }}”
when: item.server is defined and (item.server | selectattr(‘log’, ‘defined’)) !=
However, the code does not work on version 2.9.6 and I get the below error:
"The task includes an option with an undefined variable. The error was: ‘str object’ has no attribute ‘name’\n\nThe error appears to be in ‘/root/test.yml’: line 29, column 8
Is there an alternate solution to my requirement?