You've already forked deploy-vm
big fat commit with everything working !
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
---
|
||||
# Migration optionnelle vers proxmox_node si différent du nœud du template.
|
||||
# Déclenchée uniquement si proxmox_node est défini et != resolved_node (nœud du clone).
|
||||
# La VM doit être arrêtée — ce qui est le cas entre le clone et le démarrage.
|
||||
|
||||
- name: deploy-vm | migrate VM to target node
|
||||
when:
|
||||
- proxmox_node | default('') | length > 0
|
||||
- proxmox_node != resolved_node
|
||||
block:
|
||||
# Proxmox impose un ticket de session pour les appels POST directs (CSRF)
|
||||
- name: deploy-vm | authenticate to Proxmox API (migration)
|
||||
ansible.builtin.uri:
|
||||
url: "https://{{ proxmox_host }}:8006/api2/json/access/ticket"
|
||||
method: POST
|
||||
body_format: form-urlencoded
|
||||
body:
|
||||
username: "{{ proxmox_api_user }}"
|
||||
password: "{{ proxmox_api_password }}"
|
||||
validate_certs: "{{ proxmox_validate_certs }}"
|
||||
status_code: 200
|
||||
register: _proxmox_auth
|
||||
no_log: true
|
||||
|
||||
- name: "deploy-vm | migrate '{{ vm_name }}' : {{ resolved_node }} → {{ proxmox_node }}"
|
||||
ansible.builtin.uri:
|
||||
url: >-
|
||||
https://{{ proxmox_host }}:8006/api2/json/nodes/{{ resolved_node }}/qemu/{{ resolved_vm_id }}/migrate
|
||||
method: POST
|
||||
headers:
|
||||
Cookie: "PVEAuthCookie={{ _proxmox_auth.json.data.ticket }}"
|
||||
CSRFPreventionToken: "{{ _proxmox_auth.json.data.CSRFPreventionToken }}"
|
||||
body_format: form-urlencoded
|
||||
body:
|
||||
target: "{{ proxmox_node }}"
|
||||
online: 0
|
||||
"with-local-disks": "{{ 1 if vm_migrate_with_local_disks | bool else 0 }}"
|
||||
validate_certs: "{{ proxmox_validate_certs }}"
|
||||
status_code: 200
|
||||
register: _migrate_result
|
||||
|
||||
# Proxmox retourne un UPID (ex: UPID:node:pid:…) — on poll jusqu'à status = stopped
|
||||
- name: deploy-vm | wait for migration task to complete
|
||||
ansible.builtin.uri:
|
||||
url: >-
|
||||
https://{{ proxmox_host }}:8006/api2/json/nodes/{{ resolved_node }}/tasks/{{ _migrate_result.json.data | urlencode }}/status
|
||||
method: GET
|
||||
headers:
|
||||
Cookie: "PVEAuthCookie={{ _proxmox_auth.json.data.ticket }}"
|
||||
validate_certs: "{{ proxmox_validate_certs }}"
|
||||
register: _migration_status
|
||||
until: _migration_status.json.data.status == 'stopped'
|
||||
retries: "{{ (vm_wait_timeout | int / 10) | int }}"
|
||||
delay: 10
|
||||
|
||||
- name: deploy-vm | assert migration succeeded
|
||||
ansible.builtin.assert:
|
||||
that: _migration_status.json.data.exitstatus == 'OK'
|
||||
fail_msg: >-
|
||||
Migration de '{{ vm_name }}' vers '{{ proxmox_node }}' échouée :
|
||||
{{ _migration_status.json.data.exitstatus }}
|
||||
|
||||
- name: deploy-vm | update resolved_node after migration
|
||||
ansible.builtin.set_fact:
|
||||
resolved_node: "{{ proxmox_node }}"
|
||||
Reference in New Issue
Block a user