Introduction

VMware tags organize vSphere resources — datastores, VMs, hosts, networks — into categories for management, policy enforcement, and reporting. Using Ansible's community.vmware collection, you can programmatically retrieve datastore information including tags, capacity, and usage across your entire vSphere environment.

Prerequisites

Install the VMware Collection

ansible-galaxy collection install community.vmware

Python Dependencies

pip install PyVmomi vSphere-Automation-SDK

vCenter Credentials

Store credentials securely with Ansible Vault:

ansible-vault create group_vars/vcenter/vault.yml
# group_vars/vcenter/vault.yml
vault_vcenter_hostname: vcenter.example.com
vault_vcenter_username: administrator@vsphere.local
vault_vcenter_password: YourSecurePassword

Basic: List Datastore Tags

---
- name: List VMware Datastore Tags
  hosts: localhost
  gather_facts: false
  vars:
    vcenter_hostname: "{{ vault_vcenter_hostname }}"
    vcenter_username: "{{ vault_vcenter_username }}"
    vcenter_password: "{{ vault_vcenter_password }}"

  tasks:
    - name: Gather datastore information
      community.vmware.vmware_datastore_info:
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: false
      register: datastore_info

    - name: Display all datastores with tags
      ansible.builtin.debug:
        msg: |
          Datastore: {{ item.name }}
          Tags: {{ item.tags | default([]) | map(attribute='name') | join(', ') }}
          Capacity: {{ (item.capacity / 1073741824) | round(1) }} GB
          Free: {{ (item.freeSpace / 1073741824) | round(1) }} GB
      loop: "{{ datastore_info.datastores }}"
      loop_control:
        label: "{{ item.name }}"

Filter by Datacenter or Cluster

- name: Get datastores from specific datacenter
  community.vmware.vmware_datastore_info:
    hostname: "{{ vcenter_hostname }}"
    username: "{{ vcenter_username }}"
    password: "{{ vcenter_password }}"
    datacenter: "DC-Production"
    validate_certs: false
  register: dc_datastores

- name: Get datastores from specific cluster
  community.vmware.vmware_datastore_info:
    hostname: "{{ vcenter_hostname }}"
    username: "{{ vcenter_username }}"
    password: "{{ vcenter_password }}"
    cluster: "Cluster-01"
    validate_certs: false
  register: cluster_datastores

Filter Datastores by Tag

- name: Find datastores with specific tag
  ansible.builtin.set_fact:
    production_datastores: >-
      {{ datastore_info.datastores |
         selectattr('tags', 'defined') |
         selectattr('tags', 'search', 'production') |
         list }}

- name: Show production datastores
  ansible.builtin.debug:
    msg: "{{ item.name }} — {{ (item.freeSpace / 1073741824) | round(1) }} GB free"
  loop: "{{ production_datastores }}"
  loop_control:
    label: "{{ item.name }}"

Capacity Report

- name: Generate datastore capacity report
  hosts: localhost
  gather_facts: true
  tasks:
    - name: Gather datastore info
      community.vmware.vmware_datastore_info:
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: false
      register: datastore_info

    - name: Create CSV report
      ansible.builtin.copy:
        dest: "/tmp/datastore_report_{{ ansible_date_time.date }}.csv"
        content: |
          Name,Capacity_GB,Free_GB,Used_Percent,Tags
          {% for ds in datastore_info.datastores %}
          {{ ds.name }},{{ (ds.capacity / 1073741824) | round(1) }},{{ (ds.freeSpace / 1073741824) | round(1) }},{{ (((ds.capacity - ds.freeSpace) / ds.capacity) * 100) | round(1) }},{{ ds.tags | default([]) | map(attribute='name') | join(';') }}
          {% endfor %}

    - name: Alert on low-space datastores
      ansible.builtin.debug:
        msg: "⚠️ {{ item.name }} is {{ (((item.capacity - item.freeSpace) / item.capacity) * 100) | round(1) }}% full!"
      loop: "{{ datastore_info.datastores }}"
      loop_control:
        label: "{{ item.name }}"
      when: ((item.capacity - item.freeSpace) / item.capacity) > 0.85

Manage Tags with Ansible

List All Tag Categories

- name: Get tag categories
  community.vmware.vmware_category_info:
    hostname: "{{ vcenter_hostname }}"
    username: "{{ vcenter_username }}"
    password: "{{ vcenter_password }}"
    validate_certs: false
  register: tag_categories

- name: Show categories
  ansible.builtin.debug:
    var: tag_categories.tag_category_info

Create and Assign Tags

- name: Create tag category
  community.vmware.vmware_category:
    hostname: "{{ vcenter_hostname }}"
    username: "{{ vcenter_username }}"
    password: "{{ vcenter_password }}"
    category_name: "StorageTier"
    category_description: "Storage tier classification"
    category_cardinality: "single"
    associable_object_types:
      - Datastore
    validate_certs: false

- name: Create tag
  community.vmware.vmware_tag:
    hostname: "{{ vcenter_hostname }}"
    username: "{{ vcenter_username }}"
    password: "{{ vcenter_password }}"
    tag_name: "tier-1-ssd"
    tag_description: "Tier 1 SSD storage"
    category_id: "StorageTier"
    validate_certs: false

- name: Assign tag to datastore
  community.vmware.vmware_tag_manager:
    hostname: "{{ vcenter_hostname }}"
    username: "{{ vcenter_username }}"
    password: "{{ vcenter_password }}"
    tag_names:
      - "StorageTier:tier-1-ssd"
    object_name: "datastore-ssd-01"
    object_type: Datastore
    state: present
    validate_certs: false

VMware Module Reference

ModulePurpose
vmware_datastore_infoGet datastore details + tags
vmware_tagCreate/delete tags
vmware_tag_managerAssign/remove tags from objects
vmware_categoryManage tag categories
vmware_category_infoList tag categories
vmware_datastore_clusterManage datastore clusters
vmware_host_datastoreMount/unmount datastores on hosts

Conclusion

The vmware_datastore_info module retrieves comprehensive datastore details including tags, capacity, and free space from vCenter. Combine it with vmware_tag_manager to assign tags programmatically, and use Jinja2 templates to generate capacity reports. Always store vCenter credentials in Ansible Vault and use validate_certs: true with proper CA certificates in production.