With VCF 9.1, Broadcom introduced Zero Touch Provisioning (ZTP), a capability that takes a bare-metal server at a remote edge site from power-on to a fully registered host in a vSphere cluster, without an engineer on site. No manual configuration, no PXE infrastructure, no USB sticks. Just a network cable and a power button. While testing this in my lab, I ran into a problem that I suspect others will hit as well: my ESX installation consistently stalled at "Reading installation script" whenever the management network lived on a tagged VLAN. Here is what happened, why it happens, and the one-line fix that solved it.
How ZTP network boot works
Starting with VCF 9.1, the management of UEFI HTTPS Boot moves from Auto Deploy to Zero Touch Provisioning. Instead of the classic PXE chain with TFTP and iPXE, ZTP uses a UEFI HTTPS boot URL served straight from vCenter. Three components make this work. The Boot Routing Service (BRS) exposes a single vCenter-level boot URL (https://<vcenter>/vmw/brs/vbmx64.efi) that applies to every physical machine in your environment. The new first-stage bootloader, vSphere Boot Manager (vBM), replaces iPXE and submits hardware identifiers such as UUID, MAC address, and SMBIOS data to BRS. BRS evaluates those identifiers against the Auto Deploy rule engine and redirects the host to a cluster-specific boot URL served by the Network Boot Service (NBS), which hosts the ESX boot images on the vCenter filesystem under /vmw/nbs/clusters/<cluster-id>/.
You can watch this two-stage pipeline on the console of the booting host. After the BRS redirect, the host pulls its boot configuration from the NBS cluster URL:
Loading https://10.1.1.11/vmw/nbs/clusters/domain-c1358/529f948b-99e8-626c-91f5-54819ccaa5b9/image-0/boot.cfg
So far, so good. The installer boots, the modules load, and the automated installation kicks off. In my setup the host is connected to a trunk port, the management network is tagged VLAN 100, and IP addresses on that network are handed out by a DHCP server.
The problem
The installation ran fine right up to the point where ESX was installed and the installer needed to fetch and process the installation script. There it hung, indefinitely, on:
Reading installation script
The reason turned out to be simple once I understood what the installer was doing. When the ESX installer brings up its management interface, it creates vmk0 without a VLAN ID. That is perfectly fine when the management network is untagged or carried as the native VLAN on the switch port. But on a trunk port with a tagged management VLAN, an untagged vmk0 is talking into the void: its DHCP requests never reach the DHCP server on VLAN 100, the host never gets an IP address, and the installer can never retrieve the installation script it needs to continue. Hence the eternal "Reading installation script".
The fix: add vlanid to boot.cfg
The ESX installer supports a boot option called vlanid, which tells it to tag the installer network interface (and consequently vmk0) with a specific VLAN ID. The trick is getting that option into the ZTP boot flow, and the boot screen itself points you to the right place: the boot.cfg file that NBS serves to the host.
The cluster-specific Network Boot Folders live on the vCenter Server Appliance filesystem, matching the URL you see on the console. Take the path from the boot screen, in my case:
/vmw/nbs/clusters/domain-c1358/529f948b-99e8-626c-91f5-54819ccaa5b9/image-0/boot.cfg
SSH into the vCenter appliance, locate that boot.cfg, and open it. Inside you will find the kernelopt line that carries the boot options for the installer. All you need to do is append the vlanid option directly after weasel (the ESX installer):
kernelopt=runweasel vlanid=100
Save the file and boot the edge host again. This time the installer tags its network interface with VLAN 100, vmk0 comes up on the correct management VLAN, the DHCP server on the management network hands out an IP address, and the installation script is fetched and executed without any drama. The host completed the rest of the ZTP workflow and registered itself in the vSphere cluster exactly as advertised: zero on-site interaction.
Wrapping up
Zero Touch Provisioning in VCF 9.1 is an impressive piece of automation: a single UEFI HTTPS boot URL, no PXE or TFTP infrastructure, and hardware-aware routing to the right cluster image via BRS and NBS. But the current workflow assumes an untagged management network during the installation phase. If your edge sites use a tagged management VLAN with DHCP, as many production networks do, the installer will stall at "Reading installation script" because vmk0 comes up without a VLAN ID and never obtains an address.
The workaround is a single boot option: edit the boot.cfg that NBS serves for your cluster image and add vlanid=<your management VLAN> to the kernelopt line, right after weasel. It would be great to see this exposed as a first-class setting in the ZTP configuration in a future release, so the installer inherits the management VLAN from the cluster network profile automatically. Until then, this one-liner gets your tagged edge sites provisioned hands-free.




