--- # Capture les valeurs globales avant la boucle pour éviter la récursion infinie. # Sans ça, "vm_cores: {{ item.cores | default(vm_cores) }}" → Ansible évalue vm_cores # qui pointe vers lui-même (le task var en cours de définition) → boucle infinie. - name: deploy-vm | snapshot global defaults before VM loop ansible.builtin.set_fact: _g_proxmox_node: "{{ proxmox_node }}" _g_template_name: "{{ template_name }}" _g_vm_cores: "{{ vm_cores }}" _g_vm_sockets: "{{ vm_sockets }}" _g_vm_memory: "{{ vm_memory }}" _g_vm_gateway: "{{ vm_gateway }}" _g_vm_dns: "{{ vm_dns }}" _g_vm_disk_name: "{{ vm_disk_name }}" _g_vm_disk_size: "{{ vm_disk_size }}" _g_vm_extra_disks: "{{ vm_extra_disks }}" _g_vm_ciuser: "{{ vm_ciuser }}" _g_vm_cipassword: "{{ vm_cipassword }}" _g_vm_sshkeys: "{{ vm_sshkeys }}" _g_vm_full_clone: "{{ vm_full_clone }}" _g_vm_start_on_boot: "{{ vm_start_on_boot }}" _g_vm_wait_timeout: "{{ vm_wait_timeout }}" _g_vm_force_update: "{{ vm_force_update }}" _g_vm_migrate_with_local_disks: "{{ vm_migrate_with_local_disks }}" # Chaque entrée de 'vms' peut surcharger n'importe quel champ. # Champs obligatoires : name, ip. # Tous les autres héritent du snapshot global ci-dessus. - name: "deploy-vm | deploy '{{ item.name }}'" ansible.builtin.include_tasks: deploy_one.yml vars: vm_name: "{{ item.name }}" vm_id: "{{ item.id | default(None) }}" vm_cores: "{{ item.cores | default(_g_vm_cores) }}" vm_sockets: "{{ item.sockets | default(_g_vm_sockets) }}" vm_memory: "{{ item.memory | default(_g_vm_memory) }}" vm_ip: "{{ item.ip }}" vm_gateway: "{{ item.gateway | default(_g_vm_gateway) }}" vm_dns: "{{ item.dns | default(_g_vm_dns) }}" vm_disk_name: "{{ item.disk_name | default(_g_vm_disk_name) }}" vm_disk_size: "{{ item.disk_size | default(_g_vm_disk_size) }}" vm_extra_disks: "{{ item.extra_disks | default(_g_vm_extra_disks) }}" vm_ciuser: "{{ item.ciuser | default(_g_vm_ciuser) }}" vm_cipassword: "{{ item.cipassword | default(_g_vm_cipassword) }}" vm_sshkeys: "{{ item.sshkeys | default(_g_vm_sshkeys) }}" vm_full_clone: "{{ item.full_clone | default(_g_vm_full_clone) }}" vm_start_on_boot: "{{ item.start_on_boot | default(_g_vm_start_on_boot) }}" vm_wait_timeout: "{{ item.wait_timeout | default(_g_vm_wait_timeout) }}" vm_force_update: "{{ item.force_update | default(_g_vm_force_update) }}" vm_migrate_with_local_disks: "{{ item.migrate_with_local_disks | default(_g_vm_migrate_with_local_disks) }}" proxmox_node: "{{ item.proxmox_node | default(_g_proxmox_node) }}" template_name: "{{ item.template_name | default(_g_template_name) }}" loop: "{{ vms }}" loop_control: label: "{{ item.name }}"