I wanted to share this nice tip that I was able to use today.
What I needed to do is to interact with the Ansible Tower API to associate a host to a group. I retrieved the host ID by parsing the JSON dictionnary. However, when I invoked later on the uri module, I noticed that Jinja2 would always return a string, whereas I needed an integer.
The int filter would not work "as is" - the solution is rather neat, and only requires to send the JSON body to Ansible directly:
- name: Associate host to group uri: url: "https://localhost/api/v2/groups/{{ group_id.json.results[0].id }}/hosts/" method: POST user: admin password: "{{ towerpass }}" body:
# Notice the construct - this allows me to ass the ID as an integer
# instead of a string '{ "id": {{ host_id.json.results[0].id | int }} }' body_format: json validate_certs: False force_basic_auth: yes status_code: - 200 - 204 - 400 register: response changed_when: response.status == 20
Happy Ansibl'ing!
Hi @Razique !
That's a nice one, thanks ! Maybe useful for my upcoming EX447 :D
I found another way to do it:
body: "{{ host_id.json.results | json_query('[].{id:id}') | first }}"
You can replace the | first filter by a more advanced query inside the brackets to exactly match the host you want.
I don't like it very much either. I hope the | int filter will be improved in the future so that the natural construction key: value | int would just work as it should ;)
So, this one uses the native JSON parser to access the id entry? How does the id:id work?
Hi! :)
Yes exactly.
The idea here is to extract the key/value pair at once, so that Ansible does not transform the value type to string from integer.
The id:id is a JMESpath multiselect (second example). The first id is an arbitrary name that you want to use as the key name in the resulting key/value list, in this case the key name which is needed in the body of your uri request. The second id is the key to get the value from in your input json structure (for each item of host_id.json.results).
I regularly use this syntax to select only a few interesting key/value pairs from a list of larger dictionaries.
This is pretty cool @littlebigfab thanks for sharing this cool tip :)
Red Hat
Learning Community
A collaborative learning environment, enabling open source skill development.