loop through a json object

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”
}
},

`

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 %}

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.

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.

`

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 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.

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”
}

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.

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