diff --git a/roles/libvirt_manager/templates/domain.xml.j2 b/roles/libvirt_manager/templates/domain.xml.j2
index d52bfb4f9e..f67695b4e7 100644
--- a/roles/libvirt_manager/templates/domain.xml.j2
+++ b/roles/libvirt_manager/templates/domain.xml.j2
@@ -16,7 +16,36 @@
-
+
+{% if vm_data.numa is defined and vm_data.numa|int > 1 %}
+
+
+ {% set base_cpu = (vm_data.cpus|int / vm_data.numa|int)|int %}
+ {% set cpu_rem = vm_data.cpus|int % vm_data.numa|int %}
+ {% set base_mem = (vm_data.memory|int / vm_data.numa|int)|int %}
+ {% set mem_rem = vm_data.memory|int % vm_data.numa|int %}
+
+ {# Use a namespace to persist cpu_start across loop iterations #}
+ {% set tracker = namespace(cpu_start=0) %}
+
+ {% for i in range(vm_data.numa|int) %}
+ {% set current_cores = base_cpu + (1 if i < cpu_rem else 0) %}
+ {% set current_mem = base_mem + (1 if i < mem_rem else 0) %}
+ {% set cpu_end = tracker.cpu_start + current_cores - 1 %}
+
+ |
+
+ {# Update the tracker for the next iteration #}
+ {% set tracker.cpu_start = cpu_end + 1 %}
+ {% endfor %}
+
+{% endif %}
+
+{% if vm_data.numa is defined and vm_data.numa|int > 1 %}
+
+
+
+{% endif %}