94 lines
3.1 KiB
YAML
94 lines
3.1 KiB
YAML
---
|
|
- name: Get available storage on template node
|
|
ansible.builtin.uri:
|
|
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ vm_template_node }}/storage"
|
|
method: GET
|
|
headers:
|
|
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
|
|
validate_certs: false
|
|
register: storage_info
|
|
|
|
- name: Set storage backend (prefer local-zfs if available)
|
|
ansible.builtin.set_fact:
|
|
clone_storage: "{{ 'local-zfs' if storage_info.json.data | selectattr('storage', 'equalto', 'local-zfs') | list | length > 0 else 'local-lvm' }}"
|
|
|
|
- name: Display selected storage
|
|
ansible.builtin.debug:
|
|
msg: "Using storage backend: {{ clone_storage }}"
|
|
|
|
- name: Clone VM from template (on template's node)
|
|
community.proxmox.proxmox_kvm:
|
|
api_host: "{{ proxmox_api_host }}"
|
|
api_user: "{{ proxmox_api_user }}"
|
|
api_token_id: "{{ proxmox_api_token_id }}"
|
|
api_token_secret: "{{ proxmox_api_token_secret }}"
|
|
node: "{{ vm_template_node }}"
|
|
vmid: "{{ vm_template_id }}"
|
|
clone: "template"
|
|
name: "{{ vm_hostname }}"
|
|
full: true
|
|
storage: "{{ clone_storage }}"
|
|
timeout: 600
|
|
register: cloned_vm
|
|
|
|
- name: Migrate VM to target node via API
|
|
ansible.builtin.uri:
|
|
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ vm_template_node }}/qemu/{{ cloned_vm.vmid }}/migrate"
|
|
method: POST
|
|
headers:
|
|
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
|
|
body_format: form-urlencoded
|
|
body:
|
|
target: "{{ target_node }}"
|
|
online: "0"
|
|
with-local-disks: "1"
|
|
validate_certs: false
|
|
status_code: [200]
|
|
register: migrate_task
|
|
when: vm_template_node != target_node
|
|
|
|
- name: Wait for migration task to complete
|
|
ansible.builtin.uri:
|
|
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ target_node }}/qemu/{{ cloned_vm.vmid }}/status/current"
|
|
method: GET
|
|
headers:
|
|
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
|
|
validate_certs: false
|
|
register: vm_check
|
|
until: vm_check.status == 200
|
|
retries: 60
|
|
delay: 10
|
|
when: vm_template_node != target_node
|
|
|
|
- name: Wait for VM to unlock
|
|
ansible.builtin.wait_for:
|
|
timeout: 30
|
|
|
|
- name: Configure VM resources
|
|
community.proxmox.proxmox_kvm:
|
|
api_host: "{{ proxmox_api_host }}"
|
|
api_user: "{{ proxmox_api_user }}"
|
|
api_token_id: "{{ proxmox_api_token_id }}"
|
|
api_token_secret: "{{ proxmox_api_token_secret }}"
|
|
node: "{{ target_node }}"
|
|
vmid: "{{ cloned_vm.vmid }}"
|
|
cores: "{{ cpu_cores }}"
|
|
memory: "{{ ram_gb | int * 1024 }}"
|
|
net:
|
|
net0: "virtio,bridge=vmbr0"
|
|
update: true
|
|
|
|
- name: Start the VM
|
|
community.proxmox.proxmox_kvm:
|
|
api_host: "{{ proxmox_api_host }}"
|
|
api_user: "{{ proxmox_api_user }}"
|
|
api_token_id: "{{ proxmox_api_token_id }}"
|
|
api_token_secret: "{{ proxmox_api_token_secret }}"
|
|
node: "{{ target_node }}"
|
|
vmid: "{{ cloned_vm.vmid }}"
|
|
state: started
|
|
|
|
- name: Set VMID fact for later use
|
|
ansible.builtin.set_fact:
|
|
created_vmid: "{{ cloned_vm.vmid }}"
|