loop through a json object

36 views
Skip to first unread message

Nicholas Britton

unread,
Aug 23, 2019, 4:22:58 PM8/23/19
to Ansible Project
I am trying to loop through a json object that is returned and list out key pieces of information, or later on do something with these key peices of information from each object.  I have been trying to do this with JMESpath examples but have not had much luck.   Would anyone be able to help point me in the right direction.    

For this example i am trying to pull out hostGroup.hostGroupdId, hostGroup.hostgroupname, ldev.ldevid, lun.lun, lun.lunid

Here is a sample of the output returned from json_out.json:

TASK [debug lunpaths] *******************************************************************************************************************************************************************************
ok
: [127.0.0.1] => {
   
"msg": {
       
"count": 4,
       
"data": [
           
{
               
"hostGroup": {
                   
"hostGroupId": "CL7-A,15",
                   
"hostGroupName": "host12",
                   
"hostGroupNumber": 15,
                   
"hostMode": "VMWARE_EX",
                   
"hostModeOptions": [
                       
54,
                       
63
                   
],
                   
"portId": "CL7-A",
                   
"storageDeviceId": "886000999999"
               
},
               
"ldev": {
                   
"attributes": [
                       
"CVS",
                       
"HDT"
                   
],
                   
"blockCapacity": 2147483648,
                   
"byteFormatCapacity": "1.00 T",
                   
"clprId": 0,
                   
"dataReductionMode": "disabled",
                   
"dataReductionStatus": "DISABLED",
                   
"emulationType": "OPEN-V-CVS",
                   
"isDefined": true,
                   
"isFullAllocationEnabled": false,
                   
"isRelocationEnabled": true,
                   
"label": "BackupSFTP",
                   
"ldevId": 82,
                   
"mpBladeId": 0,
                   
"numOfUsedBlock": 3096576,
                   
"poolId": 0,
                   
"status": "NML",
                   
"storageDeviceId": "886000999999",
                   
"tierLevel": "all",
                   
"tierLevelForNewPageAllocation": "M",
                   
"usedCapacityPerTierLevel1": 1512,
                   
"usedCapacityPerTierLevel2": 0
               
},
               
"lun": {
                   
"lun": 5,
                   
"lunId": "CL7-A,15,5",
                   
"storageDeviceId": "886000428027"
               
}
           
},
           
{
               
"hostGroup": {
                   
"hostGroupId": "CL7-B,15",
                   
"hostGroupName": "host12",
                   
"hostGroupNumber": 15,
                   
"hostMode": "VMWARE_EX",
                   
"hostModeOptions": [
                       
54,
                       
63
                   
],
                   
"portId": "CL7-B",
                   
"storageDeviceId": "886000999999"
               
},
               
"ldev": {
                   
"attributes": [
                       
"CVS",
                       
"HDT"
                   
],
                   
"blockCapacity": 2147483648,
                   
"byteFormatCapacity": "1.00 T",
                   
"clprId": 0,
                   
"dataReductionMode": "disabled",
                   
"dataReductionStatus": "DISABLED",
                   
"emulationType": "OPEN-V-CVS",
                   
"isDefined": true,
                   
"isFullAllocationEnabled": false,
                   
"isRelocationEnabled": true,
                   
"label": "BackupSFTP",
                   
"ldevId": 82,
                   
"mpBladeId": 0,
                   
"numOfUsedBlock": 3096576,
                   
"poolId": 0,
                   
"status": "NML",
                   
"storageDeviceId": "886000999999",
                   
"tierLevel": "all",
                   
"tierLevelForNewPageAllocation": "M",
                   
"usedCapacityPerTierLevel1": 1512,
                   
"usedCapacityPerTierLevel2": 0
               
},
               
"lun": {
                   
"lun": 5,
                   
"lunId": "CL7-B,15,5",
                   
"storageDeviceId": "886000428027"
               
}
           
},






Kai Stian Olstad

unread,
Aug 23, 2019, 6:25:41 PM8/23/19
to ansible...@googlegroups.com
It depends on how you are going to use it, you can get the value like so

{{ json_out.json.data | map(attribute='hostGroup.hostGroupName') |
list }}


or loop around it with Jinja

{% for i in json_out.json.data %}
{{ i.hostGroup.hostGroupName }}
{{ i.lun.lun }}
{{ i.lun.lunId }}
{% endfor %}

--
Kai Stian Olstad

Nicholas Britton

unread,
Aug 23, 2019, 8:18:06 PM8/23/19
to ansible...@googlegroups.com
It's going to be used as input for a uri request. I will want to loop through each hostgroup and repeat until done with the list. 

I have not looked yet but I will also want to filter the list by the name. 

Nicholas Britton

unread,
Aug 24, 2019, 1:11:12 AM8/24/19
to Ansible Project
I got it to work with this:

  - name : print all hostgroups
    debug
:
      msg
: "{{item.hostGroup.hostGroupName}},{{item.hostGroup.hostGroupId}}"
    loop
: "{{sessions.json.data}}"
   
when: item.hostGroup.hostGroupName | regex_search('.*am1.*')(.*\.9$)




I cant get the regex to work right.    I am looking to match am1 anywhere in the string, but end with specific numbers such as 1-8 or 9-16.   Any help there would be appreciated.


My next step will be to figure out how to do a loop and do something with that data.    such as execute a uri block that will use the item.#### as inputs to the body of the uri call.   I have not had much luck locating what i think would do that, if someone has an example that would be great.     

Kai Stian Olstad

unread,
Aug 24, 2019, 3:43:07 AM8/24/19
to ansible...@googlegroups.com
On 24.08.2019 07:11, Nicholas Britton wrote:
> I got it to work with this:
>
> - name : print all hostgroups
> debug:
> msg:
> "{{item.hostGroup.hostGroupName}},{{item.hostGroup.hostGroupId}}"
> loop: "{{sessions.json.data}}"
> when: item.hostGroup.hostGroupName |
> regex_search('.*am1.*')(.*\.9$)
>
>
>
>
> I cant get the regex to work right. I am looking to match am1
> anywhere
> in the string, but end with specific numbers such as 1-8 or 9-16. Any
> help there would be appreciated.

You can eliminate when by using Jinja filter, i would recommend reading
about all of them[1]

- name : print all hostgroups
debug:
msg:
"{{item.hostGroup.hostGroupName}},{{item.hostGroup.hostGroupId}}"
loop: "{{ sessions.json.data | selectattr('hostGroup.hostGroupName',
'search', 'am1.*9$') | list }}"

selectattr is a Jinja filter and search is a Ansible regex contains
filter.



> My next step will be to figure out how to do a loop and do something
> with
> that data. such as execute a uri block that will use the item.####
> as
> inputs to the body of the uri call. I have not had much luck locating
> what i think would do that, if someone has an example that would be
> great.

Wouldn't that just be to use the uri module with the loop above and just
{{ item.xxxx }} where every you need.


[1]
https://jinja.palletsprojects.com/en/2.10.x/templates/#list-of-builtin-filters


--
Kai Stian Olstad

Joe Langdon

unread,
Aug 24, 2019, 11:41:33 AM8/24/19
to ansible...@googlegroups.com
Kai I really appreciate your consistent and persistent responses on this board. I am learning a lot from you!

--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/8b1ca238d9d91fdc00d8fe198b3ef533%40olstad.com.


--

Joe Langdon

Sometimes when you think life is kicking you in the ass, it's actually just moving you quickly to a better place.


Kai Stian Olstad

unread,
Aug 24, 2019, 12:34:22 PM8/24/19
to ansible...@googlegroups.com
On 24.08.2019 17:41, Joe Langdon wrote:
> Kai I really appreciate your consistent and persistent responses on this
> board. I am learning a lot from you!

Thank you for the kind words, much appreciated.


--
Kai Stian Olstad

Nicholas Britton

unread,
Aug 26, 2019, 1:42:47 PM8/26/19
to Ansible Project
Thank you, that has helped alot.   

I was looking at the max option:

- name: debug - show max lun number
    debug
:
      msg
: "{{item.lun.lun}}"
    loop
: "{{luns.json.data}}"
   
when: "{{item.lun.lun | max}}"


But it returns the following:
TASK [debug - show max lun number] ****************************************************************************************************************************************
fatal: [127.0.0.1]: FAILED! => {"msg": "The conditional check '{{item.lun.lun | max}}' failed. The error was: Unexpected templating type error occurred on ({{item.lun.lun | max}}): 'int' object is not iterable\n\nThe error appears to be in '/home/nbritton/ansible/gts-core-storage-operations/hds/get_luninfo.yml': line 65, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n  - name: debug - show max lun number\n    ^ here\n"}

The value i am after is the last one in the output here:

TASK [debug new vars] *****************************************************************************************************************************************************
ok: [127.0.0.1] => {
    "msg": "am1vmhost12,CL8-B,15,83,SFTP,6"
}




On Friday, August 23, 2019 at 3:22:58 PM UTC-5, Nicholas Britton wrote:

Nicholas Britton

unread,
Aug 27, 2019, 9:12:39 AM8/27/19
to Ansible Project
I got this figured out.  I needed to add a step before, to create a list with all the values , then find the max of it.  

Boa Ah

unread,
Oct 22, 2019, 6:35:35 PM10/22/19
to Ansible Project
Hi
Can you please post your whole task solution coz am having a similar need. My post is here: I need to pull all hostname a and ssh to them
https://groups.google.com/forum/m/#!topic/ansible-project/BInJVHkXvjo
Reply all
Reply to author
Forward
0 new messages