--- - name: Unmount installer mounts ansible.builtin.include_tasks: unmount.yml - name: Shutdown installer environment ansible.builtin.include_tasks: shutdown.yml - name: Cleanup hypervisor resources ansible.builtin.include_tasks: "{{ hypervisor_type }}.yml" - name: Determine post-reboot connectivity ansible.builtin.set_fact: cleanup_post_reboot_can_connect: >- {{ ( post_reboot_can_connect if post_reboot_can_connect is defined else ( (ansible_connection | default('ssh')) != 'ssh' or ((system_cfg.network.ip | default('') | string | length) > 0) or ( system_cfg.type == 'physical' and (ansible_host | default('') | string | length) > 0 ) ) ) | bool }} - name: Check VM accessibility after reboot when: - cleanup_verify_boot | bool - system_cfg.type == "virtual" - cleanup_post_reboot_can_connect | bool block: - name: Attempt to connect to VM delegate_to: "{{ inventory_hostname }}" ansible.builtin.wait_for_connection: timeout: "{{ cleanup_boot_timeout }}" register: cleanup_vm_connection_check failed_when: false changed_when: false - name: VM failed to boot - initiate cleanup when: - cleanup_remove_on_failure | bool - cleanup_vm_connection_check is defined - cleanup_vm_connection_check.failed | bool - virtualization_vm_created_in_run | default(false) | bool block: - name: VM boot failure detected - removing VM ansible.builtin.debug: msg: | VM {{ hostname }} failed to boot after provisioning. This VM was created in the current playbook run and will be removed to prevent orphaned resources. - name: Remove failed libvirt VM when: hypervisor_type == "libvirt" delegate_to: localhost become: false block: - name: Destroy libvirt VM community.libvirt.virt: name: "{{ hostname }}" state: destroyed failed_when: false - name: Undefine libvirt VM community.libvirt.virt: name: "{{ hostname }}" command: undefine - name: Remove libvirt VM disks ansible.builtin.file: path: "{{ item.path }}" state: absent loop: "{{ virtualization_libvirt_disks | default([]) }}" loop_control: label: "{{ item.path }}" - name: Remove libvirt cloud-init disk ansible.builtin.file: path: "{{ virtualization_libvirt_cloudinit_path }}" state: absent - name: Remove failed Proxmox VM when: hypervisor_type == "proxmox" delegate_to: localhost become: false module_defaults: community.proxmox.proxmox_kvm: "{{ _proxmox_auth_node }}" no_log: true block: - name: Stop Proxmox VM community.proxmox.proxmox_kvm: name: "{{ hostname }}" vmid: "{{ system_cfg.id }}" state: stopped - name: Delete Proxmox VM community.proxmox.proxmox_kvm: name: "{{ hostname }}" vmid: "{{ system_cfg.id }}" state: absent unprivileged: false - name: Remove failed VMware VM when: hypervisor_type == "vmware" delegate_to: localhost become: false module_defaults: community.vmware.vmware_guest: "{{ _vmware_auth }}" no_log: true block: - name: Power off VMware VM community.vmware.vmware_guest: name: "{{ hostname }}" folder: "{{ system_cfg.path | default('/') }}" state: poweredoff - name: Delete VMware VM community.vmware.vmware_guest: name: "{{ hostname }}" folder: "{{ system_cfg.path | default('/') }}" state: absent - name: Remove failed Xen VM when: hypervisor_type == "xen" delegate_to: localhost become: false block: - name: Destroy Xen VM if running ansible.builtin.command: argv: - xl - destroy - "{{ hostname }}" register: cleanup_xen_destroy failed_when: false changed_when: cleanup_xen_destroy.rc == 0 - name: Remove Xen VM disks ansible.builtin.file: path: "{{ item.path }}" state: absent loop: "{{ virtualization_xen_disks | default([]) }}" loop_control: label: "{{ item.path }}" - name: Remove Xen VM config file ansible.builtin.file: path: "/tmp/xen-{{ hostname }}.cfg" state: absent - name: VM cleanup completed ansible.builtin.debug: msg: VM {{ hostname }} has been successfully removed due to boot failure.