- name: Set full image path on Proxmox ansible.builtin.set_fact: remote_image_path: "{{ dest_image_path }}{{ image_filename }}" delegate_to: localhost - name: Check if 'backup' template VM exists ansible.builtin.command: "qm status {{ vmid_backup_template }}" register: backup_vm_status failed_when: false changed_when: false - name: Check if 'latest' template VM exists ansible.builtin.command: "qm status {{ vmid_latest_template }}" register: latest_vm_status failed_when: false changed_when: false - name: Destroy existing 'backup' template VM (to ensure a clean slate for rotation) ansible.builtin.command: "qm destroy {{ vmid_backup_template }} --purge" when: backup_vm_status.rc == 0 # Only destroy if it actually exists register: destroy_backup_result - name: Clone 'latest' template to 'backup' template VMID (if 'latest' exists) ansible.builtin.shell: | qm clone {{ vmid_latest_template }} {{ vmid_backup_template }} --name {{ vmname_backup_template }} --full --storage {{ storage_name }} qm template {{ vmid_backup_template }} qm destroy {{ vmid_latest_template }} --purge when: latest_vm_status.rc == 0 # Only clone if 'latest' VM exists register: clone_to_backup_result - name: Restore VM from image to 'latest' template VMID ansible.builtin.shell: | qmrestore {{ remote_image_path }} {{ vmid_latest_template }} --unique true --storage {{ storage_name }} qm set {{ vmid_latest_template }} --cores {{ cpu_cores }} --memory {{ memory_mb }} --name {{ vmname_latest_template }} --tag {{ template_version }} qm template {{ vmid_latest_template }} register: restore_new_latest_result changed_when: restore_new_latest_result.rc == 0