In vSphere 7.0 Update 3, the vSphere Guest Operating System (OS) Customization Engine has added native support for using cloud-init, which is an industry standard for customizing Linux-based operating systems. This additional GuestOS customization option is currently only available when using the vSphere API, either vSphere SOAP API or vSphere REST API and is not available for consumption when using the vSphere UI.
As part of a recent project, I was exploring some of the customization options and since I had not played with this specific API before, I figured this would be a good exercise. I quickly found that it was not very user intuitive in getting started, especially with the lack of end-to-end examples since this can only be consumed using the vSphere API. I also came across a number of different VMware KBs (here, here and here) that outlined various requirements and constraints when using cloud-init which also added to the confusion.
The high level requirements for using the new vSphere Guest OS Customization with cloud-init is the following:
- vSphere 7.0. Update 3 or later (vCenter and ESXi)
- VMware Tools running 11.3 or later
- cloud-init running 21.1 or later
Note: Although VMware PhotonOS does support cloud-init natively, it is not a supported operating system when using the new vSphere GuestOS Customization with cloud-init due to how cloud-init has been integrated. For customers that require customization via cloud-init with PhotonOS, should continue using either the seed ISO option or the GuestInfo OVF option.
In this blog post, I will explore the complete end-to-end workflow from preparing a GuestOS for customization to applying the actual vSphere customization spec using the new cloud-init option. In addition, I have also created a simple PowerShell script which demonstrates the use of the vSphere REST API on constructing the required specification for using the new cloud-init option and this should hopefully help folks understand how the underlying API works with a working example.