Recently I’ve been looking at a tool to automate the provisioning of the vCloud Director appliance. I wanted something that could quickly take JSON as input for the OVF properties and be able to consistently deploy the appliance with the same outcome. I tried Terraform, however that didn’t quite work out as I expected as the Terraform provider for vSphere’s vsphere_virtual_machine resource, is not able to deploy OVA or OVFs directly.
Here’s what HashiCorp has to say about that…
NOTE: Neither the
vsphere_virtual_machine
resource nor the vSphere provider supports importing of OVA or OVF files as this is a workflow that is fundamentally not the domain of Terraform. The supported path for deployment in Terraform is to first import the virtual machine into a template that has not been powered on, and then clone from that template. This can be accomplished with Packer, govc‘simport.ovf
andimport.ova
subcommands, or ovftool.
The way that this could be done is to first import the OVA without vApp properties, then convert it to a template, then use Terraform to create a new VM from that template and use the vapp section to customise the appliance.
vapp {
properties = {
"guestinfo.tf.internal.id" = "42"
}
This didn’t work for me as not all vApp properties are implemented in the vsphere_virtual_machine resource yet. Let me know if you are able to get this to work.
So that’s where govc came in handy.
govc is a vSphere CLI built on top of govmomi.
The CLI is designed to be a user friendly CLI alternative to the GUI and well suited for automation tasks. It also acts as a test harness for the govmomi APIs and provides working examples of how to use the APIs.
Once you’ve installed govc, you can then setup the environment by entering the following examples into your shell:
export GOVC_URL="https://vcenter-onprem.vcd.lab"
export GOVC_USERNAME='administrator@vsphere.local'
export GOVC_PASSWORD='My$ecureP4ssw0rd!'
export GOVC_INSECURE=true
To deploy the appliance we will use the govc inport.ova command.
However, before you can do that, you need to obtain the JSON file that contains all the OVF properties for you to edit and then use as an input into the import.ova options with govc.
To create the JSON file run the following command
govc import.spec /path_to_vcd_appliance.ova | python -m json.tool > vcd-appliance.json
govc import.spec /volumes/STORAGE/Terraform/VMware_vCloud_Director-10.0.0.4649-15450333_OVF10.ova | python -m json.tool > vcd-appliance.json
Then edit the vcd-appliance.json file and enter the parameters for your vCD appliance. Then deploy the appliance with the govc import.ova command.
The format for this command is
govc import.ova –options=/path_to_vcd_appliance.json vcd_appliance.ova
govc import.ova -ds=NVMe --options=/Users/phanh/Downloads/terraformdir/govc/vcd-appliance.json /volumes/STORAGE/Terraform/VMware_vCloud_Director-10.0.0.4649-15450333_OVF10.ova
You should now see your vCD appliance being deployed to your vCenter server.
This method also works for any OVA/OVF deployment, including the NSX-T unified appliance, vROPs, vRO.
The next natural step would be to continue the configuration of vCloud Director with the Terraform provider for vCloud Director.
One thought on “How to deploy vCloud Director Appliance with Terraform and govc”