All the "physical" providers (EC2, OpenStack, MAAS, Azure) were generating user data in essentially the same way. The MAAS one looked different but actually just added an optional bit that was still completely generic. And so this branch unifies the implementations.
Construction of the cloudinit.MachineConfig was lifted out of the function. That may seem arbitrary, but it's part of a greater plan: in a later step of the ongoing refactoring the construction can be lifted out of the providers' internalStartInstance methods as well, doing away with the EC2 and OpenStack providers' startInstanceParams structs. This actually shortens some of the data flows and reduces cognitive load, which can only be good for maintenance.
After that step we can have a fresh look at sanitizing NewMachineConfig (which arguably should take more parameters, or not exist at all, but is in an intermediate state that facilitates the changes happening now). We may also look into re-introducing some sort of dedicated Parameter Object for internalStartInstance, but by then the cluster of methods Bootstrap / StartInstance / internalStartInstance will look a bit different and we can find the most maintainable solution for that new situation.