Parsing json output issues

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 :frowning: 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.