Hello Ansible friends,
I’m hoping that you can provide some assistance here. I’m trying to parsed through json response from a web application, but I’m having some issues. The goal of this playbook is to display the site-id for all routers in the json response. Any help is appreciated, thank you.
Here is the ansible playbook.
-
hosts: vmanage
connection: local
gather_facts: no
tasks:
-
vmanage_device_facts:
user: “{{ ansible_user }}”
host: “{{ ansible_host }}”
password: “{{ ansible_password }}”
register: output
-
name: Create device dictionary
set_fact:
device_status: ‘{{ output | json_query(“vedges[0].[“side-id”]”)}}’
-
name: Print out site ids
debug:
msg: “{{ device_status }}”
Hello Ansible friends,
I’m hoping that you can provide some assistance here. I’m trying to parsed through json response from a web application, but I’m having some issues. The goal of this playbook is to display the site-id for all routers in the json response. Any help is appreciated, thank you.
Here is the ansible playbook.
-
hosts: vmanage
connection: local
gather_facts: no
tasks:
-
vmanage_device_facts:
user: “{{ ansible_user }}”
host: “{{ ansible_host }}”
password: “{{ ansible_password }}”
register: output
-
name: Create device dictionary
set_fact:
device_status: ‘{{ output | json_query(“vedges[0].[“side-id”]”)}}’
Try quoting side-id with backticks
Backticks don't work I see. This should do it:
device_status: "{{ output | json_query('vedges[0].[\'side-id\']') }}"
Thank you for your reply Dick, the backspace didn’t work here, please see error below. I tried all kinds of combinations Do you have any other ideas?
PLAY [vmanage] **********************************************************************************************************************
TASK [vmanage_device_facts] *********************************************************************************************************
[WARNING]: Module did not set no_log for password
ok: [10.10.2.2]
TASK [parse through output] *********************************************************************************************************
fatal: [10.10.2.2]: FAILED! => {“msg”: “template error while templating string: expected token ‘,’, got ‘side’. String: device_status:"{{ output | json_query(‘vedges[0].[\\‘side-id\\’]’) }}"”}
PLAY RECAP **************************************************************************************************************************
10.10.2.2 : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
Did you try this literal string?
device_status: "{{ output | json_query('vedges[0].[\'side-id\']') }}"
Yes I did, see the playbook below please.
-
hosts: vmanage
connection: local
gather_facts: no
tasks:
-
vmanage_device_facts:
user: “{{ ansible_user }}”
host: “{{ ansible_host }}”
password: “{{ ansible_password }}”
register: output
-
name: parse through output
set_fact:
device_status:“{{ output | json_query(‘vedges[0].['side-id']’) }}”
-
name: Print out neighbors
debug:
msg: “{{ device_status }}”
Try converting the data to something that ansible can parse using the from_json filter, then just access it using the json path that in your case ends with vedges[0][‘side-id’]
Also why do put a dot between [0] and [‘side-id’] ? no need
for some reason, I couldn’t get it to work. I ended up using Ansible URI module to get the information from API and parse it after. It works now. Thank you to all that responded.