The UUID of a machine comes from the mainboard, it should always be unique. UUID support was added to MAAS because some machines, such as IBM Z series mainframes, don’t have consistent MAC addresses. When booting IBM S390X and BIOS x86 system identify themselves using the UUID first. On BIOS x86 if the server(MAAS) returns a 404 it tries with the MAC address the system booted with.
Starting with MAAS 2.7 we gather most hardware information from the commissioning script 50-maas-01-commissioning. This script downloads a binary, runs it, and captures the output. The binary itself is actually just the /resources and / endpoints from LXD. lshw is still run as you can configure MAAS to automatically create tags based on lshw output.
I would consider this a bug in your systems firmware and report it to your manufacturer. I understand that may take awhile to get fixed, so you’re looking for a workaround to get MAAS working now. MAAS still supports booting by MAC address as its still the primary method for UEFI and other firmwares, it can operate without using the UUID if your platform supports it.
Neither of these options would be officially supported but either should fix your problem.
The easiest fix is by modifying the MAAS source code to just not store the hardware_uuid. If you’re using the Debian packages keep in mind upgrading will remove this fix. If you’re using the Snap you’ll have to build the Snap yourself.
diff --git a/src/metadataserver/builtin_scripts/hooks.py b/src/metadataserver/builtin_scripts/hooks.py
index 26c7e1137..fe219081c 100644
--- a/src/metadataserver/builtin_scripts/hooks.py
+++ b/src/metadataserver/builtin_scripts/hooks.py
@@ -415,7 +415,11 @@ def _process_system_information(node, system_data):
uuid = system_data.get("uuid")
# Convert "" to None, so that the unique check isn't triggered.
- node.hardware_uuid = None if uuid == "" else uuid
+ # node.hardware_uuid = None if uuid == "" else uuid
+ # Disable gathering the UUID as this environment contains non-unique
+ # hardware UUID's. Systems will be identified during boot using their
+ # MAC address.
+ node.hardware_uuid = None
# Gather system information. Custom built machines and some Supermicro
# servers do not provide this information.
You could also modify this in the database. Keep in mind that you’ll have to run this after enlisting/commissioning every machine and machines will have to be added serially.
UPDATE maasserver_node SET hardware_uuid=NULL;