Get Field with equal condition from json generated ansible 2.5.2 uri module

I need get a field into a json what has been generated wit uri module.

This is my json that contains two hosts colections hc1 y hc2.
I want to get the field id:693 of the host_collection hc1.

            "created_at": "2018-10-18 13:29:01 UTC", 
            "description": null, 
            "id": 693, 
            "max_hosts": null, 
            "name": "hc1", 
            "organization_id": 1, 
            "permissions": {
                "deletable": true, 
                "editable": true
            }, 
            "total_hosts": 0, 
            "unlimited_hosts": true, 
            "updated_at": "2018-10-18 13:29:01 UTC"
        }, 
        {
            "created_at": "2018-10-18 13:29:04 UTC", 
            "description": null, 
            "id": 696, 
            "max_hosts": null, 
            "name": "hc2", 
            "organization_id": 1, 
            "permissions": {
                "deletable": true, 
                "editable": true
            }, 
            "total_hosts": 0, 
            "unlimited_hosts": true, 
            "updated_at": "2018-10-18 13:29:04 UTC"
        }, 

My playbook is this, but it fails.

 - name: GET consulta api satellite
    uri:
       url: "https://xxxxxx/katello/api/host_collections/"
       user: "{{user}}"
       password: "{{password}}"
       method: GET
       return_content: yes
       force_basic_auth: yes
       validate_certs: no
       headers:
               Content-Type: "application/json"
       status_code: [200,201,202,204,301,401]
    register: hc

  - name: GET ID d HC

    debug: 
       var="hc.json.results.[?name=='hc1'].id"

When I execute de playbook, it appears the next error:

TASK [GET ID del HC] *******************************************************************************************************************************************************************************
fatal: []: FAILED! => {}

MSG:

template error while templating string: unexpected char u'?' at 19. String: {{hc.json.results.[?name=='hc1'].id}}
        to retry, use: --limit @/awx/scripts/sat_uri/mb_get_host_collection.retry

If I put this option, go OK.

- name: GET ID del HC
    debug:
       var=hc.json.results[0].id
 

**TASK [GET ID del HC] *******************************************************************************************************************************************************************************
ok: [] => {
    "hc.json.results[0].id": "693"
}**

Try

  • debug: var=hc.json.results|json_query(‘[?name==hc1].id’)

It works OK, thanks.

  • name: LIST id HC
    debug:
    var=hc.json.results|json_query(‘[?name=={{host_collection}}].id’)

TASK [LIST id HC] *******************************************************************************************************************************************
ok: => {
“hc.json.results|json_query(‘[?name==hc1].id’)”: [
693
]
}

But I have another problem.
I want to use that variable for another uri execution, but i don´t know how to pass the value to a var.

I tried with this, but it fails:

  • set_fact:
    hc_id: “{{hc.json.results|json_query(‘[?name=={{host_collection}}].id’)}}”

  • name: LIST id HC
    debug:
    var=hc_id

  • name: GET INFO NODES HOST COLLECTION
    uri:
    url: “https://xxxxxxx/katello/api/host_collections/{{hc_id}}/”
    user: “{{user}}”
    password: “{{password}}”
    method: GET
    return_content: yes
    force_basic_auth: yes
    validate_certs: no
    headers:
    Content-Type: “application/json”
    status_code: [200,201,202,204,301,401]
    register: hc_info

  • name: LIST id HC
    debug:

hc_id variable is empty:

TASK [set_fact] *********************************************************************************************************************************************
ok: [ssh.sva.itbatera.ejgv.eus]

TASK [LIST id HC] *******************************************************************************************************************************************
ok: [ssh.sva.itbatera.ejgv.eus] => {
“hc_id”:
}

Define it under a vars section.

https://docs.ansible.com/ansible/devel/user_guide/playbooks_variables.html#variables-defined-in-a-playbook

I tried with

vars:
hc_id: “{{hc.json.results|json_query(‘[?name=={{host_collection}}].id’)}}”

And with

vars:
hc_id: “{{hc.json.results|json_query(‘[?name==\"{{host_collection}}\"].id’)}}”

But the variable is empty always.

TASK [LIST id HC] *******************************************************************************************************************************************
ok: => {
“hc_id”:
}

The problem is that I have a variable {{host_collection}} into another variable definition and I have to scaped the {} symbols, no?

You can't use {{ }} inside {{ }}, you'll need to use Jinja concatenation
I'm not 100% sure if this is correct but you can try:

"{{ hc.json.results | json_query('[?name==`' ~ host_collection ~ '`].id') }}"

It works ok.

Thank You.

hc_id: “{{ hc.json.results | json_query(‘[?name==' ~ host_collection ~ '].id’) }}”

TASK [GET id HC hc2] *********************************************************************************************************************
ok: [xxxx] => {
“hc_id”: [
586
]
}

TASK [LIST INFO hc2 with UID /586] ******************************************************************************************************
ok: [ssh.sva.itbatera.ejgv.eus] => {
“hc_info.json”: {
“created_at”: “2018-10-18 10:47:52 UTC”,
“description”: null,
“host_ids”: [
1280
],
“id”: 586,
“max_hosts”: null,
“name”: “hc2”,
“organization_id”: 1,
“permissions”: {
“deletable”: true,
“editable”: true
},
“total_hosts”: 1,
“unlimited_hosts”: true,
“updated_at”: “2018-10-18 10:47:52 UTC”
}
}