MaaS with an external DHCP server (EdgeMax)

Introduction

For the overhaul of my network I was planning to potentially employ MaaS to more easily onboard and test new machines. I already had some experience with MaaS for an OpenStack deployment, however in that deployment MaaS was the fully fledged DNS and DHCP server, with no real external networking to take into account. In my own network, the idea was to incorporate MaaS in what already existed, for at least the meanwhile.
Within the documentation there was no mention how to use an external DHCP server and the StackOverflow links all pointed to outdated or dead documentation.

This documentation pertains to MaaS version 2.4.2

Maas Bootconfig & DHCP

As it turns out, unless you create a DHCP server on MaaS at least once, it does not actually build the needed files. For my untagged default VLAN I therefore first allowed MaaS to provide DHCP via the Take Action menu. I immediatly disabled this same DHCP server, but at this point I was sure that the system would have th needed files.

EdgeMax config

I use my Edgerouter Lite for DHCP and thus some pxe boot parameters would have to be set. As per (https://blog.laslabs.com/2013/05/pxe-booting-with-ubiquiti-edgerouter/), I set the parameters, with the IP pointing at my MaaS server.

However, this didn't turn out to work very well. My Dell nodes booted up but then spit out some sort of error regarding the TFTP server. With some experimentation, I found out that the /boot/ part is not needed, as MaaS provides the pxe files at a lower level. The configuration was then as follows:

bootfile-name bootx64.efi
bootfile-server 192.168.4.118
subnet-parameters "filename "bootx64.efi";"
tftp-server-name 192.168.4.118

Also note the use of bootx64.efi. The default pxelinux.0 is merely suited to the legacy BIOS boot. Looking in the /var/lib/maas/dhcpd.conf when I allowed the DHCP server to be active showed me some key pointers in this regard:

#
# Bootloaders
#
if option arch = 00:00 {
    # pxe
    filename "pxelinux.0";
} elsif option arch = 00:07 {
    # uefi_amd64
    filename "bootx64.efi";
} elsif option arch = 00:09 {
    # uefi_amd64
    filename "bootx64.efi";
} elsif option arch = 00:0B {
    # uefi_arm64
    filename "grubaa64.efi";
} elsif option arch = 00:0C {
    # open-firmware_ppc64el
    filename "bootppc64.bin";
} elsif option arch = 00:0E {
    # powernv
    filename "pxelinux.0";
    option path-prefix "ppc64el/";
} else {
    # pxe
    filename "pxelinux.0";
}

It clearly states that a different file is needed for the EFI PXE boot. With this all set, the nodes all booted perfectly fine and were added to my inventory.