 Razique
		
			Razique
		
		
		 
		
		
		
		
		
	
			
		
		
			
					
		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!
 littlebigfab
		
			littlebigfab
		
		
		 
		
		
		
		
		
	
			
		
		
			
					
		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 ;)
 Razique
		
			Razique
		
		
		 
		
		
		
		
		
	
			
		
		
			
					
		So, this one uses the native JSON parser to access the id entry? How does the id:id work?
 littlebigfab
		
			littlebigfab
		
		
		 
		
		
		
		
		
	
			
		
		
			
					
		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.
 Razique
		
			Razique
		
		
		 
		
		
		
		
		
	
			
		
		
			
					
		This is pretty cool @littlebigfab thanks for sharing this cool tip :)
Red Hat
Learning Community
A collaborative learning environment, enabling open source skill development.