0

I'm trying to extract the result from the value "mac_addr" and then register it (in this case 00:50:56:a2:57:c9)

The output I'm working with

"msg": [
        {
            "changed": false,
            "failed": false,
            "network_data": {
                "0": {
                    "allow_guest_ctl": true,
                    "connected": true,
                    "device_type": "test0",
                    "label": "test1",
                    "mac_addr": "00:50:56:a2:57:c9",
                    "name": "DVSwitch: ",
                    "start_connected": true,
                    "unit_number": 7,
                    "wake_onlan": true

I've tried different commands but I can get past the "0" value. Here the last commands I've tried.

    - name: show test result
      debug:
        msg:
         - "{{ test.network_data | json_query('0[*].mac_addr') }}"
      register: mac

AND

    - name: show test result
      debug:
        msg:
         - "{{ test.network_data.0 | json_query('mac_addr') }}"
      register: mac

The output is in the "test" variable

I'm a beginner in Ansible and JSON. Can you please tell what I'm doing wrong ?

I'm working with ansible 2.9.

Thanks

1 Answer 1

3

JSON dictionary keys need to be strings, and the JMESPath parser interprets a bare 0 as an integer. To make it explicitly a string, you can quote it, giving you:

{{ test.network_data | json_query('"0".mac_addr') }}

Although for the data you've shown, you don't need to use json_query; you can just write:

{{ test.network_data["0"].mac_addr }}

Here's a playbook that demonstrates both options:

- hosts: localhost
  gather_facts: false
  vars:
    network_data:
      "0":
        "allow_guest_ctl": true,
        "connected": true,
        "device_type": "test0"
        "label": "test1"
        "mac_addr": "00:50:56:a2:57:c9"
        "name": "DVSwitch: "
        "start_connected": true
        "unit_number": 7
        "wake_onlan": true

  tasks:
    - name: extract value using json_query
      debug:
        msg:
          - >-
            {{ network_data | json_query('"0".mac_addr') }}

    - name: extract value using jinja syntax
      debug:
        msg:
          - >-
            {{ network_data["0"].mac_addr }}

That outputs:

PLAY [localhost] ***************************************************************

TASK [extract value using json_query] ******************************************
ok: [localhost] => {
    "msg": [
        "00:50:56:a2:57:c9"
    ]
}

TASK [extract value using jinja syntax] ****************************************
ok: [localhost] => {
    "msg": [
        "00:50:56:a2:57:c9"
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Lastly, in your examples you're using register on your debug task. Don't do that -- if you want to extract data into a variable, use the set_fact module:

- name: extract mac address
  set_fact:
    mac: '{{ network_data["0"].mac_addr }}'
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.