--- modeline: | vim: set ft=pandoc: description: > This VMware Packer builder uses the vSphere API to clone an existing vSphere template and create a new virtual machine remotely. page_title: VSphere Clone - Builders sidebar_title: VSphere Clone --- # VMWare Vsphere Clone Builder Type: `vsphere-clone` Artifact BuilderId: `jetbrains.vsphere` This builder clones VMs from existing templates. - VMware Player is not required. - It uses the official vCenter API, and does not require ESXi host [modification](/docs/builders/vmware-iso.html#building-on-a-remote-vsphere-hypervisor) - This builder is supported for vSphere version 6.5 and greater. Builds on lower versions may work, but some configuration options may throw errors because they do not exist in the older versions of the vSphere API. ## Examples See complete Ubuntu, Windows, and macOS templates in the [examples folder](https://github.com/hashicorp/packer/tree/master/builder/vsphere/examples/). ## VSphere-Clone Configuration Reference There are many configuration options available for this builder. In addition to the items listed here, you will want to look at the general configuration references for [Hardware](#hardware-configuration), [Output](#output-configuration), [Boot](#boot-configuration), [Run](#run-configuration), [Shutdown](#shutdown-configuration), [Communicator](#communicator-configuration), [Export](#export-configuration), configuration references, which are necessary for this build to succeed and can be found further down the page. @include 'builder/vsphere/clone/Config-not-required.mdx' ### Clone Configuration @include 'builder/vsphere/clone/CloneConfig-not-required.mdx' @include 'builder/vsphere/common/StorageConfig-not-required.mdx' ### Storage Configuration When cloning a VM, the storage configuration can be used to add additional storage and disk controllers. The resulting VM will contain the origin VM storage and disk controller plus the new configured ones. @include 'builder/vsphere/common/DiskConfig.mdx' @include 'builder/vsphere/common/DiskConfig-required.mdx' #### Optional @include 'builder/vsphere/common/DiskConfig-not-required.mdx' ### vApp Options Configuration @include 'builder/vsphere/clone/vAppConfig-not-required.mdx' Example of usage: ```json "vapp": { "properties": { "hostname": "{{ user `hostname`}}", "user-data": "{{ env `USERDATA`}}" } } ``` A `user-data` field requires the content of a yaml file to be encoded with base64. This can be done via environment variable: `export USERDATA=$(gzip -c9 /dev/null || base64; })` ```hcl vapp { properties = { hostname = var.hostname user-data = base64encode(var.user_data) } } ``` ### Extra Configuration Parameters @include 'builder/vsphere/common/ConfigParamsConfig-not-required.mdx' ### Customization @include '/builder/vsphere/clone/CustomizeConfig.mdx' @include 'builder/vsphere/clone/CustomizeConfig-not-required.mdx' #### Network Interface Settings @include 'builder/vsphere/clone/NetworkInterface-not-required.mdx' #### Global Routing Settings @include 'builder/vsphere/clone/GlobalRoutingSettings.mdx' @include 'builder/vsphere/clone/GlobalRoutingSettings-not-required.mdx' #### Global DNS Settings @include 'builder/vsphere/clone/GlobalDnsSettings.mdx' @include 'builder/vsphere/clone/GlobalDnsSettings-not-required.mdx' #### Linux Customization Settings @include 'builder/vsphere/clone/LinuxOptions-not-required.mdx' #### Customization Example ```json "customize": { "linux_options": { "host_name": "packer-test", "domain": "test.internal" }, "network_interface": { "ipv4_address": "10.0.0.10", "ipv4_netmask": "24" }, "ipv4_gateway": "10.0.0.1", "dns_server_list": ["10.0.0.18"] } ``` ```hcl customize { linux_options { host_name = "packer-test" domain = "test.internal" } network_interface { ipv4_address = "10.0.0.10" ipv4_netmask = "24" } ipv4_gateway = 10.0.0.1 dns_server_list = ["10.0.0.18"] } ``` ### Boot configuration @include 'packer-plugin-sdk/bootcommand/BootConfig.mdx' #### Optional: @include 'packer-plugin-sdk/bootcommand/BootConfig-not-required.mdx' @include 'builder/vsphere/common/BootConfig-not-required.mdx' ### Http directory configuration @include 'packer-plugin-sdk/multistep/commonsteps/HTTPConfig.mdx' #### Optional: @include 'packer-plugin-sdk/multistep/commonsteps/HTTPConfig-not-required.mdx' ### Floppy configuration @include 'builder/vsphere/common/FloppyConfig-not-required.mdx' ### Connection Configuration @include 'builder/vsphere/common/ConnectConfig-not-required.mdx' ### Hardware Configuration @include 'builder/vsphere/common/HardwareConfig-not-required.mdx' ### Location Configuration @include 'builder/vsphere/common/LocationConfig-not-required.mdx' ### Run Configuration @include 'builder/vsphere/common/RunConfig-not-required.mdx' ### Shutdown Configuration @include 'builder/vsphere/common/ShutdownConfig-not-required.mdx' ### Wait Configuration @include 'builder/vsphere/common/WaitIpConfig-not-required.mdx' ### CDRom Configuration @include 'packer-plugin-sdk/multistep/commonsteps/CDConfig.mdx' #### Optional: @include 'packer-plugin-sdk/multistep/commonsteps/CDConfig-not-required.mdx' @include 'builder/vsphere/common/CDRomConfig-not-required.mdx' @include 'builder/vsphere/common/RemoveCDRomConfig-not-required.mdx' ### Communicator configuration #### Optional common fields: @include 'packer-plugin-sdk/communicator/Config-not-required.mdx' #### Optional SSH fields: @include 'packer-plugin-sdk/communicator/SSH-not-required.mdx' @include 'packer-plugin-sdk/communicator/SSHTemporaryKeyPair-not-required.mdx' @include 'packer-plugin-sdk/communicator/SSH-Key-Pair-Name-not-required.mdx' @include 'packer-plugin-sdk/communicator/SSH-Private-Key-File-not-required.mdx' @include 'packer-plugin-sdk/communicator/SSH-Agent-Auth-not-required.mdx' -> **NOTE:** Packer uses vApp Options to inject ssh public keys to the Virtual Machine. The [temporary_key_pair_name](/docs/builders/vmware/vsphere-clone#temporary_key_pair_name) will only work if the template being cloned contains the vApp property `public-keys`. If using [ssh_private_key_file](/docs/builders/vmware/vsphere-clone#ssh_private_key_file), provide the public key via [configuration_parameters](/docs/builders/vmware/vsphere-clone#configuration_parameters) or [vApp Options Configuration](/docs/builders/vmware/vsphere-clone#vapp-options-configuration) whenever the `guestinto.userdata` is available. See [VMware Guestinfo datasource](https://github.com/vmware/cloud-init-vmware-guestinfo) for more information about the key. #### Optional WinRM fields: @include 'packer-plugin-sdk/communicator/WinRM-not-required.mdx' ### Export Configuration @include 'builder/vsphere/common/ExportConfig.mdx' #### Optional: @include 'builder/vsphere/common/ExportConfig-not-required.mdx' #### Output Configuration: @include 'builder/vsphere/common/OutputConfig-not-required.mdx' ### Content Library Import Configuration @include 'builder/vsphere/common/ContentLibraryDestinationConfig.mdx' @include 'builder/vsphere/common/ContentLibraryDestinationConfig-not-required.mdx' Minimal example of usage: ```json "content_library_destination" : { "library": "Packer Library Test" } ``` ```hcl content_library_destination { library = "Packer Library Test" } ``` ## Working With Clusters And Hosts #### Standalone Hosts Only use the `host` option. Optionally specify a `resource_pool`: ```json "host": "esxi-1.vsphere65.test", "resource_pool": "pool1", ``` ```hcl host = "esxi-1.vsphere65.test" resource_pool = "pool1" ``` #### Clusters Without DRS Use the `cluster` and `host`parameters: ```json "cluster": "cluster1", "host": "esxi-2.vsphere65.test", ``` ```hcl cluster = "cluster1" host = "esxi-2.vsphere65.test" ``` #### Clusters With DRS Only use the `cluster` option. Optionally specify a `resource_pool`: ```json "cluster": "cluster2", "resource_pool": "pool1", ``` ```hcl cluster = "cluster2" resource_pool = "pool1" ``` ## Required vSphere Permissions - VM folder (this object and children): ```text Virtual machine -> Inventory Virtual machine -> Configuration Virtual machine -> Interaction Virtual machine -> Snapshot management Virtual machine -> Provisioning ``` Individual privileges are listed in https://github.com/jetbrains-infra/packer-builder-vsphere/issues/97#issuecomment-436063235. - Resource pool, host, or cluster (this object): ```text Resource -> Assign virtual machine to resource pool ``` - Host in clusters without DRS (this object): ```text Read-only ``` - Datastore (this object): ```text Datastore -> Allocate space Datastore -> Browse datastore Datastore -> Low level file operations ``` - Network (this object): ```text Network -> Assign network ``` - Distributed switch (this object): ```text Read-only ``` For floppy image upload: - Datacenter (this object): ```text Datastore -> Low level file operations ``` - Host (this object): ```text Host -> Configuration -> System Management ```