如何用Ansible获取剩余空间最大的VMware数据存储URL?
从VMware数据存储列表中提取剩余空间最大的存储URL并创建Kubernetes存储类
需求说明
需要从vmware_datastore_info模块获取的VMware数据存储列表中,筛选出剩余空间(freeSpace)最大的数据存储,提取其URL,再使用该URL在Kubernetes集群中创建存储类。
现有Ansible代码
- name: 收集ESXi数据中心信息 hosts: localhost gather_facts: false tasks: - name: 收集ESXi数据存储信息 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
模块返回的示例数据
{ "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/" } ] }
解决方案
1. 提取剩余空间最大的数据存储URL
在现有Ansible任务中添加以下任务,利用Ansible过滤器筛选出剩余空间最大的存储并提取其URL:
- name: 提取剩余空间最大的数据存储URL set_fact: max_free_datastore_url: "{{ info.datastores | max(attribute='freeSpace') | json_query('url') }}" - name: 验证提取的URL debug: var=max_free_datastore_url
- 说明:
max(attribute='freeSpace')遍历数据存储列表,找出freeSpace值最大的元素;json_query('url')从该元素中提取url字段。如果有多个存储剩余空间相同,max会返回列表中第一个符合条件的存储。
2. 使用提取的URL创建Kubernetes存储类
添加Ansible任务调用k8s模块创建存储类(需确保已安装kubernetes.core集合):
- name: 创建VMware存储类 k8s: state: present definition: apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: vmware-max-free-sc provisioner: csi.vsphere.vmware.com parameters: datastoreURL: "{{ max_free_datastore_url }}" reclaimPolicy: Delete volumeBindingMode: Immediate
- 说明:这里使用vSphere CSI驱动作为存储类的provisioner,你可以根据实际环境调整provisioner及其他参数(如
reclaimPolicy、volumeBindingMode)。
内容的提问来源于stack exchange,提问作者chin wooi Ng
相关产品推荐
相关产品推荐

