Files
proxmox-template-clone/roles/proxmox_vm/tasks/main.yml

94 lines
3.3 KiB
YAML

---
- name: Get next available VMID from Proxmox API
ansible.builtin.uri:
url: "https://{{ proxmox_api_host }}:8006/api2/json/cluster/nextid"
method: GET
headers:
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
validate_certs: false
register: nextid_response
- name: Set VMID fact
ansible.builtin.set_fact:
next_vmid: "{{ nextid_response.json.data }}"
- name: Clone VM from template via API
ansible.builtin.uri:
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ vm_template_node }}/qemu/{{ vm_template_id }}/clone"
method: POST
headers:
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
body_format: form-urlencoded
body:
newid: "{{ next_vmid }}"
name: "{{ vm_hostname }}"
full: "1"
storage: "local-lvm"
validate_certs: false
register: clone_result
- name: Wait for clone task to complete
ansible.builtin.uri:
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ vm_template_node }}/qemu/{{ next_vmid }}/status/current"
method: GET
headers:
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
validate_certs: false
register: vm_status
until: vm_status.status == 200
retries: 60
delay: 5
- name: Migrate VM to target node
ansible.builtin.uri:
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ vm_template_node }}/qemu/{{ next_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
when: vm_template_node != target_node
register: migrate_result
- name: Wait for migration to complete
ansible.builtin.uri:
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ target_node }}/qemu/{{ next_vmid }}/status/current"
method: GET
headers:
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
validate_certs: false
register: vm_status
until: vm_status.status == 200
retries: 30
delay: 10
when: vm_template_node != target_node
- name: Configure VM resources
ansible.builtin.uri:
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ target_node }}/qemu/{{ next_vmid }}/config"
method: PUT
headers:
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
body_format: form-urlencoded
body:
cores: "{{ cpu_cores }}"
memory: "{{ ram_gb | int * 1024 }}"
net0: "virtio,bridge=vmbr0"
validate_certs: false
- name: Start the VM
ansible.builtin.uri:
url: "https://{{ proxmox_api_host }}:8006/api2/json/nodes/{{ target_node }}/qemu/{{ next_vmid }}/status/start"
method: POST
headers:
Authorization: "PVEAPIToken={{ proxmox_api_user }}!{{ proxmox_api_token_id }}={{ proxmox_api_token_secret }}"
validate_certs: false
- name: Set VMID fact for later use
ansible.builtin.set_fact:
created_vmid: "{{ next_vmid }}"