Search code examples
ansible

Get the VMware datastore with the most free space with Ansible


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?


Solution

  • 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