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

57 views
Skip to first unread message

Alberto Jimenez Lozano

unread,
Oct 22, 2018, 10:58:06 AM10/22/18
to Ansible Project

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"
}**

Vladimir Botka

unread,
Oct 22, 2018, 12:02:14 PM10/22/18
to Ansible Project
Try

     - debug: var=hc.json.results|json_query('[?name==`hc1`].id')

Alberto Jimenez Lozano

unread,
Oct 23, 2018, 2:48:24 AM10/23/18
to Ansible Project
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:
       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": []
}

Adrian Sebastian Dutu

unread,
Oct 23, 2018, 4:03:35 AM10/23/18
to Ansible Project

Alberto Jimenez Lozano

unread,
Oct 23, 2018, 4:33:55 AM10/23/18
to Ansible Project
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?

Kai Stian Olstad

unread,
Oct 23, 2018, 10:02:56 AM10/23/18
to ansible...@googlegroups.com
On Tuesday, 23 October 2018 10:33:55 CEST Alberto Jimenez Lozano wrote:
> 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') }}"



--
Kai Stian Olstad


Alberto Jimenez Lozano

unread,
Oct 23, 2018, 10:30:08 AM10/23/18
to Ansible Project
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"
    }
}
Reply all
Reply to author
Forward
0 new messages