I'm trying to get the VMware datastore with the most free space and later use its URL to create a storage class in a Kubernetes cluster.
I'm getting the info using vmware_datastore_info
module, as shown below:
---
- name: Gather info from ESXi datacenter
hosts: localhost
gather_facts: false
tasks:
- name: Gather info from ESXi datastore
vmware_datastore_info:
hostname: '{{ vcenter_server }}'
username: '{{ username }}'
password: '{{ password }}'
datacenter_name: '{{ datacenter_name }}'
validate_certs: false
delegate_to: localhost
register: info
- debug: var=info.datastores
Sample info.datastores
result
{
"msg": [
{
"accessible": true,
"capacity": 5156108238848,
"datastore_cluster": "DDA_SPIT_013_002",
"freeSpace": 5154511257600,
"maintenanceMode": "normal",
"multipleHostAccess": true,
"name": "LIT013_078",
"provisioned": 1596981248,
"type": "VMFS",
"uncommitted": 0,
"url": "ds:///vmfs/volumes/64e55997-3946cc08-ce62-9440c96b1102/"
},
{
"accessible": true,
"capacity": 5156108238848,
"datastore_cluster": "DDA_SPIT_013_002",
"freeSpace": 5154341388288,
"maintenanceMode": "normal",
"multipleHostAccess": true,
"name": "LIT013_075",
"provisioned": 11265900544,
"type": "VMFS",
"uncommitted": 9499049984,
"url": "ds:///vmfs/volumes/64e5595d-02d66360-bf73-9440c96b1102/"
},
{
"accessible": true,
"capacity": 5156108238848,
"datastore_cluster": "DDA_SPIT_013_002",
"freeSpace": 5154511257600,
"maintenanceMode": "normal",
"multipleHostAccess": true,
"name": "LIT013_077",
"provisioned": 1596981248,
"type": "VMFS",
"uncommitted": 0,
"url": "ds:///vmfs/volumes/64e55986-d2d1286a-5c00-9440c96b1102/"
},
{
"accessible": true,
"capacity": 5156108238848,
"datastore_cluster": "DDA_SPIT_013_002",
"freeSpace": 5154079244288,
"maintenanceMode": "normal",
"multipleHostAccess": true,
"name": "LIT013_067",
"provisioned": 2943352832,
"type": "VMFS",
"uncommitted": 914358272,
"url": "ds:///vmfs/volumes/60743b62-a519d76c-1d48-9440c96b1102/"
},
{
"accessible": true,
"capacity": 5156108238848,
"datastore_cluster": "DDA_SPIT_013_002",
"freeSpace": 5154511257600,
"maintenanceMode": "normal",
"multipleHostAccess": true,
"name": "LIT013_074",
"provisioned": 1596981248,
"type": "VMFS",
"uncommitted": 0,
"url": "ds:///vmfs/volumes/64e5594a-07107de8-1823-9440c96b1102/"
},
{
"accessible": true,
"capacity": 5156108238848,
"datastore_cluster": "DDA_SPIT_013_002",
"freeSpace": 5154511257600,
"maintenanceMode": "normal",
"multipleHostAccess": true,
"name": "LIT013_072",
"provisioned": 1596981248,
"type": "VMFS",
"uncommitted": 0,
"url": "ds:///vmfs/volumes/64e5591a-1ed49f04-2a09-9440c96b1102/"
},
{
"accessible": true,
"capacity": 5156108238848,
"datastore_cluster": "DDA_SPIT_013_002",
"freeSpace": 4399479914496,
"maintenanceMode": "normal",
"multipleHostAccess": true,
"name": "LIT013_071",
"provisioned": 1383218544640,
"type": "VMFS",
"uncommitted": 626590220288,
"url": "ds:///vmfs/volumes/64e558fc-6a916ba4-82d3-9440c96b1102/"
},
{
"accessible": true,
"capacity": 5156108238848,
"datastore_cluster": "CZCHO_SPIT_013_002",
"freeSpace": 3060709457920,
"maintenanceMode": "normal",
"multipleHostAccess": true,
"name": "LIT013_070",
"provisioned": 2428559687680,
"type": "VMFS",
"uncommitted": 333160906752,
"url": "ds:///vmfs/volumes/6346c446-6219e6bc-f0a7-9440c96b1102/"
}
]
}
How can I get only one datastores.url
from this result?
A minimal example playbook
---
- hosts: localhost
become: false
gather_facts: false
vars:
info:
datastores: [
{
"freeSpace": 5154511257600,
"name": "LIT013_078",
"url": "ds:///vmfs/volumes/64e55997-3946cc08-ce62-9440c96b1102/"
},
{
"freeSpace": 5154341388288,
"name": "LIT013_075",
"url": "ds:///vmfs/volumes/64e5595d-02d66360-bf73-9440c96b1102/"
},
{
"freeSpace": 5154511257600,
"name": "LIT013_077",
"url": "ds:///vmfs/volumes/64e55986-d2d1286a-5c00-9440c96b1102/"
},
{
"freeSpace": 5154079244288,
"name": "LIT013_067",
"url": "ds:///vmfs/volumes/60743b62-a519d76c-1d48-9440c96b1102/"
},
{
"freeSpace": 5154511257600,
"name": "LIT013_074",
"url": "ds:///vmfs/volumes/64e5594a-07107de8-1823-9440c96b1102/"
},
{
"freeSpace": 5154511257600,
"name": "LIT013_072",
"url": "ds:///vmfs/volumes/64e5591a-1ed49f04-2a09-9440c96b1102/"
},
{
"freeSpace": 4399479914496,
"name": "LIT013_071",
"url": "ds:///vmfs/volumes/64e558fc-6a916ba4-82d3-9440c96b1102/"
},
{
"freeSpace": 3060709457920,
"name": "LIT013_070",
"url": "ds:///vmfs/volumes/6346c446-6219e6bc-f0a7-9440c96b1102/"
}
]
tasks:
- name: This is
debug:
msg: "{{ info.datastores | type_debug }}"
- name: with elements of
debug:
msg: "{{ info.datastores | first | type_debug }}"
show
TASK [This is] ***************
ok: [localhost] =>
msg: list
TASK [with elements of] ******
ok: [localhost] =>
msg: dict
that you have a list of dictionaries. So one approach could be simply extract the key tied to min/max value in a list of multiple dictionaries, means sort
it and use the last
maximum value / element.
- name: and max entry
debug:
msg: "{{ info.datastores | sort(attribute='freeSpace') | last }}"
with
TASK [and max entry] *******************************************
ok: [localhost] =>
msg:
freeSpace: 5154511257600
name: LIT013_072
url: ds:///vmfs/volumes/64e5591a-1ed49f04-2a09-9440c96b1102/
To get the URL only use in example
"{{ (info.datastores | sort(attribute='freeSpace') | last).url }}"
Further Reading