--- - name: Delete VMs and all associated disks (PVCs) hosts: localhost gather_facts: false collections: - kubernetes.core vars: namespace: default vm_names: - controller - node1 - node2 - node3 - node4 - node5 - utility disks: - rootdisk - disk2 - disk3 tasks: ########################################################################### # Delete VMs ########################################################################### - name: Delete VirtualMachines k8s: api_version: kubevirt.io/v1 kind: VirtualMachine name: "{{ item }}" namespace: "{{ namespace }}" state: absent loop: "{{ vm_names }}" ########################################################################### # Wait until VMs are actually gone (IMPORTANT) ########################################################################### - name: Wait for VMs to be fully deleted k8s_info: api_version: kubevirt.io/v1 kind: VirtualMachine name: "{{ item }}" namespace: "{{ namespace }}" register: vm_check until: vm_check.resources | length == 0 retries: 30 delay: 5 loop: "{{ vm_names }}" loop_control: label: "{{ item }}" ########################################################################### # Delete PVCs (no pre-check, safe & idempotent) ########################################################################### - name: Delete PVCs for all VM disks k8s: api_version: v1 kind: PersistentVolumeClaim name: "{{ item.0 }}-{{ item.1 }}" namespace: "{{ namespace }}" state: absent loop: "{{ vm_names | product(disks) | list }}" loop_control: label: "{{ item.0 }}-{{ item.1 }}" failed_when: false