- I’m new to Terraform
- I’m using VS CODE to create *.tf file and execute them with Terraform CLI
- I’m trying to automatically build a lab in vCenter (vSphere Client)
- I’m trying to create a single subfolder and a single VM (from a template) inside it.
- The tree of Hosts in vSphere client looks like that:
company.com
|_PRODUCTION (datacenter)
|_DEV
|_PRODUCT
|_DOMAIN.COM
|_LAB_A
|_LAB_B
|_LAB_B_VM1
|_LAB_B_VM2
|_LAB_B_VM3
- IT department gave me permissions to DOMAIN.COM folder (I haven’t a permission to PRODUCTION (datacenter))
My terraform main.tf script is:
terraform {
required_providers {
vsphere = {
source = "hashicorp/vsphere"
}
}
required_version = ">= 0.13"
}
provider "vsphere" {
user = "user$domain.com"
password = "pass"
vsphere_server = "company.com"
allow_unverified_ssl = true
}
data "vsphere_datacenter" "datacenter" {
name = "PRODUCTION"
}
data "vsphere_datastore" "datastore" {
name = "datastore_01"
datacenter_id = "${data.vsphere_datacenter.datacenter.id}"
}
data "vsphere_compute_cluster" "cluster" {
name = "cluster_01"
datacenter_id = "${data.vsphere_datacenter.datacenter.id}"
}
data "vsphere_network" "network" {
name = "network_01"
datacenter_id = "${data.vsphere_datacenter.datacenter.id}"
}
data "vsphere_folder" "parent" {
path = "PRODUCTION/vm/DEV/PRODUCT/DOMAIN.COM"
}
resource "vsphere_folder" "folder" {
path = "${data.vsphere_folder.parent.path}/lab_01"
type = "folder"
datacenter_id = "${data.vsphere_datacenter.datacenter.id}"
}
data "vsphere_virtual_machine" "template_center" {
name = "WS2016"
datacenter_id = "${data.vsphere_datacenter.datacenter.id}"
}
resource "vsphere_virtual_machine" "center" {
name = "lab_01_center"
folder = "${vsphere_folder.folder.path}"
resource_pool_id = "${data.vsphere_compute_cluster.cluster.resource_pool_id}"
datastore_id = "${data.vsphere_datastore.datastore.id}"
guest_id = "${data.vsphere_virtual_machine.template_center.guest_id}"
network_interface {
network_id = "${data.vsphere_network.network.id}"
}
disk {
label = "disk0"
size = data.vsphere_virtual_machine.template_center.disks.0.size
thin_provisioned = data.vsphere_virtual_machine.template_center.disks.0.thin_provisioned
}
clone {
template_uuid = "${data.vsphere_virtual_machine.template_center.id}"
}
}
I executed the following commands:
terraform init
terraform play
terraform apply
terraform apply
was failed with the following output (sensitive data is hide with ***):
PS C:\terraform\lab_1> terraform apply
data.vsphere_datacenter.datacenter: Reading...
data.vsphere_folder.parent: Reading...
data.vsphere_datacenter.datacenter: Read complete after 0s [id=datacenter-***]
data.vsphere_network.network: Reading...
data.vsphere_datastore.datastore: Reading...
data.vsphere_compute_cluster.cluster: Reading...
data.vsphere_virtual_machine.template_center: Reading...
data.vsphere_folder.parent: Read complete after 0s [id=group-v***]
data.vsphere_network.network: Read complete after 0s [id=network-***]
data.vsphere_compute_cluster.cluster: Read complete after 0s [id=domain-c***]
data.vsphere_datastore.datastore: Read complete after 0s [id=datastore-***]
data.vsphere_virtual_machine.template_center: Read complete after 1s [id=***]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# vsphere_folder.folder will be created
+ resource "vsphere_folder" "folder" {
+ datacenter_id = "datacenter-***"
+ id = (known after apply)
+ path = "PRODUCTION/vm/DEV/PRODUCT/DOMAIN.COM/lab_01"
+ type = "vm"
}
# vsphere_virtual_machine.center will be created
+ resource "vsphere_virtual_machine" "center" {
+ annotation = (known after apply)
+ boot_retry_delay = 10000
+ change_version = (known after apply)
+ cpu_limit = -1
+ cpu_share_count = (known after apply)
+ cpu_share_level = "normal"
+ datastore_id = "datastore-134759"
+ default_ip_address = (known after apply)
+ ept_rvi_mode = "automatic"
+ firmware = "bios"
+ folder = "PRODUCTION/vm/DEV/PRODUCT/DOMAIN.COM/lab_01"
+ force_power_off = true
+ guest_id = "windows9Server64Guest"
+ guest_ip_addresses = (known after apply)
+ hardware_version = (known after apply)
+ host_system_id = (known after apply)
+ hv_mode = "hvAuto"
+ id = (known after apply)
+ ide_controller_count = 2
+ imported = (known after apply)
+ latency_sensitivity = "normal"
+ memory = 1024
+ memory_limit = -1
+ memory_share_count = (known after apply)
+ memory_share_level = "normal"
+ migrate_wait_timeout = 30
+ moid = (known after apply)
+ name = "lab_01_center"
+ num_cores_per_socket = 1
+ num_cpus = 1
+ power_state = (known after apply)
+ poweron_timeout = 300
+ reboot_required = (known after apply)
+ resource_pool_id = "resgroup-***"
+ run_tools_scripts_after_power_on = true
+ run_tools_scripts_after_resume = true
+ run_tools_scripts_before_guest_shutdown = true
+ run_tools_scripts_before_guest_standby = true
+ sata_controller_count = 0
+ scsi_bus_sharing = "noSharing"
+ scsi_controller_count = 1
+ scsi_type = "pvscsi"
+ shutdown_wait_timeout = 3
+ storage_policy_id = (known after apply)
+ swap_placement_policy = "inherit"
+ tools_upgrade_policy = "manual"
+ uuid = (known after apply)
+ vapp_transport = (known after apply)
+ vmware_tools_status = (known after apply)
+ vmx_path = (known after apply)
+ wait_for_guest_ip_timeout = 0
+ wait_for_guest_net_routable = true
+ wait_for_guest_net_timeout = 5
+ clone {
+ template_uuid = "***"
+ timeout = 30
}
+ disk {
+ attach = false
+ controller_type = "scsi"
+ datastore_id = "<computed>"
+ device_address = (known after apply)
+ disk_mode = "persistent"
+ disk_sharing = "sharingNone"
+ eagerly_scrub = false
+ io_limit = -1
+ io_reservation = 0
+ io_share_count = 0
+ io_share_level = "normal"
+ keep_on_remove = false
+ key = 0
+ label = "disk0"
+ path = (known after apply)
+ size = 60
+ storage_policy_id = (known after apply)
+ thin_provisioned = true
+ unit_number = 0
+ uuid = (known after apply)
+ write_through = false
}
+ network_interface {
+ adapter_type = "vmxnet3"
+ bandwidth_limit = -1
+ bandwidth_reservation = 0
+ bandwidth_share_count = (known after apply)
+ bandwidth_share_level = "normal"
+ device_address = (known after apply)
+ key = (known after apply)
+ mac_address = (known after apply)
+ network_id = "network-***"
}
}
Plan: 2 to add, 0 to change, 0 to destroy.
Changes to Outputs:
+ cluster = {
+ datacenter_id = "datacenter-***"
+ id = "domain-c***"
+ name = "IT"
+ resource_pool_id = "resgroup-***"
}
+ folder = {
+ custom_attributes = null
+ datacenter_id = "datacenter-***"
+ id = (known after apply)
+ path = "PRODUCTION/vm/DEV/PRODUCT/DOMAIN.COM/lab_01"
+ tags = null
+ type = "vm"
}
+ network = {
+ datacenter_id = "datacenter-***"
+ distributed_virtual_switch_uuid = null
+ id = "network-***"
+ name = "IT_VLAN***"
+ type = "Network"
}
+ parent_folder = {
+ id = "group-v***"
+ path = "PRODUCTION/vm/DEV/PRODUCT/DOMAIN.COM/lab_01"
}
+ template_center = {
+ alternate_guest_name = ""
+ annotation = ""
+ boot_delay = 0
+ boot_retry_delay = 10000
+ boot_retry_enabled = false
+ change_version = "2019-12-11T14:09:21.421166Z"
+ cpu_hot_add_enabled = false
+ cpu_hot_remove_enabled = false
+ cpu_limit = -1
+ cpu_performance_counters_enabled = false
+ cpu_reservation = 0
+ cpu_share_count = 8000
+ cpu_share_level = "normal"
+ datacenter_id = "datacenter-***"
+ default_ip_address = null
+ disks = [
+ {
+ eagerly_scrub = false
+ label = "Hard disk 1"
+ size = 60
+ thin_provisioned = true
+ unit_number = 0
},
]
+ efi_secure_boot_enabled = false
+ enable_disk_uuid = false
+ enable_logging = false
+ ept_rvi_mode = "automatic"
+ extra_config = {}
+ firmware = "bios"
+ guest_id = "windows9Server64Guest"
+ guest_ip_addresses = []
+ hardware_version = 11
+ hv_mode = "hvAuto"
+ id = "***"
+ ide_controller_scan_count = 2
+ latency_sensitivity = "normal"
+ memory = 8192
+ memory_hot_add_enabled = false
+ memory_limit = -1
+ memory_reservation = 0
+ memory_share_count = 81920
+ memory_share_level = "normal"
+ name = "WS2016"
+ nested_hv_enabled = false
+ network_interface_types = [
+ "vmxnet3",
]
+ network_interfaces = [
+ {
+ adapter_type = "vmxnet3"
+ bandwidth_limit = -1
+ bandwidth_reservation = 0
+ bandwidth_share_count = 50
+ bandwidth_share_level = "normal"
+ mac_address = "00:50:56:80:23:03"
+ network_id = "network-***"
},
]
+ num_cores_per_socket = 8
+ num_cpus = 8
+ replace_trigger = null
+ run_tools_scripts_after_power_on = true
+ run_tools_scripts_after_resume = true
+ run_tools_scripts_before_guest_reboot = false
+ run_tools_scripts_before_guest_shutdown = true
+ run_tools_scripts_before_guest_standby = true
+ sata_controller_scan_count = 0
+ scsi_bus_sharing = "noSharing"
+ scsi_controller_scan_count = 1
+ scsi_type = "lsilogic-sas"
+ storage_policy_id = null
+ swap_placement_policy = "inherit"
+ sync_time_with_host = false
+ sync_time_with_host_periodically = true
+ tools_upgrade_policy = "manual"
+ uuid = "***"
+ vapp = null
+ vapp_transport = []
+ vbs_enabled = false
+ vvtd_enabled = false
}
+ vsphere_virtual_machine = {
+ alternate_guest_name = null
+ annotation = (known after apply)
+ boot_delay = null
+ boot_retry_delay = 10000
+ boot_retry_enabled = null
+ cdrom = []
+ change_version = (known after apply)
+ clone = [
+ {
+ customize = []
+ linked_clone = null
+ ovf_network_map = null
+ ovf_storage_map = null
+ template_uuid = "***"
+ timeout = 30
},
]
+ cpu_hot_add_enabled = null
+ cpu_hot_remove_enabled = null
+ cpu_limit = -1
+ cpu_performance_counters_enabled = null
+ cpu_reservation = null
+ cpu_share_count = (known after apply)
+ cpu_share_level = "normal"
+ custom_attributes = null
+ datacenter_id = null
+ datastore_cluster_id = null
+ datastore_id = "datastore-***"
+ default_ip_address = (known after apply)
+ disk = [
+ {
+ attach = false
+ controller_type = "scsi"
+ datastore_id = "<computed>"
+ device_address = (known after apply)
+ disk_mode = "persistent"
+ disk_sharing = "sharingNone"
+ eagerly_scrub = false
+ io_limit = -1
+ io_reservation = 0
+ io_share_count = 0
+ io_share_level = "normal"
+ keep_on_remove = false
+ key = 0
+ label = "disk0"
+ path = (known after apply)
+ size = 60
+ storage_policy_id = (known after apply)
+ thin_provisioned = true
+ unit_number = 0
+ uuid = (known after apply)
+ write_through = false
},
]
+ efi_secure_boot_enabled = null
+ enable_disk_uuid = null
+ enable_logging = null
+ ept_rvi_mode = "automatic"
+ extra_config = null
+ firmware = "bios"
+ folder = "PRODUCTION/vm/DEV/PRODUCT/DOMAIN.COM/lab_01"
+ force_power_off = true
+ guest_id = "windows9Server64Guest"
+ guest_ip_addresses = (known after apply)
+ hardware_version = (known after apply)
+ host_system_id = (known after apply)
+ hv_mode = "hvAuto"
+ id = (known after apply)
+ ide_controller_count = 2
+ ignored_guest_ips = null
+ imported = (known after apply)
+ latency_sensitivity = "normal"
+ memory = 1024
+ memory_hot_add_enabled = null
+ memory_limit = -1
+ memory_reservation = null
+ memory_share_count = (known after apply)
+ memory_share_level = "normal"
+ migrate_wait_timeout = 30
+ moid = (known after apply)
+ name = "lab_01_center"
+ nested_hv_enabled = null
+ network_interface = [
+ {
+ adapter_type = "vmxnet3"
+ bandwidth_limit = -1
+ bandwidth_reservation = 0
+ bandwidth_share_count = (known after apply)
+ bandwidth_share_level = "normal"
+ device_address = (known after apply)
+ key = (known after apply)
+ mac_address = (known after apply)
+ network_id = "network-***"
+ ovf_mapping = null
+ use_static_mac = null
},
]
+ num_cores_per_socket = 1
+ num_cpus = 1
+ ovf_deploy = []
+ pci_device_id = null
+ power_state = (known after apply)
+ poweron_timeout = 300
+ reboot_required = (known after apply)
+ replace_trigger = null
+ resource_pool_id = "resgroup-***"
+ run_tools_scripts_after_power_on = true
+ run_tools_scripts_after_resume = true
+ run_tools_scripts_before_guest_reboot = null
+ run_tools_scripts_before_guest_shutdown = true
+ run_tools_scripts_before_guest_standby = true
+ sata_controller_count = 0
+ scsi_bus_sharing = "noSharing"
+ scsi_controller_count = 1
+ scsi_type = "pvscsi"
+ shutdown_wait_timeout = 3
+ storage_policy_id = (known after apply)
+ swap_placement_policy = "inherit"
+ sync_time_with_host = null
+ sync_time_with_host_periodically = null
+ tags = null
+ tools_upgrade_policy = "manual"
+ uuid = (known after apply)
+ vapp = []
+ vapp_transport = (known after apply)
+ vbs_enabled = null
+ vmware_tools_status = (known after apply)
+ vmx_path = (known after apply)
+ vvtd_enabled = null
+ wait_for_guest_ip_timeout = 0
+ wait_for_guest_net_routable = true
+ wait_for_guest_net_timeout = 5
}
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
vsphere_folder.folder: Creating...
╷
│ Error: error trying to determine parent targetFolder: folder '/PRODUCTION/vm/PRODUCTION/vm/DEV/PRODUCT/DOMAIN.COM' not found
│
│ with vsphere_folder.folder,
│ on main.tf line 58, in resource "vsphere_folder" "folder":
│ 58: resource "vsphere_folder" "folder" {
- What cause to the folder string to appear twice (see error - this string “/PRODUCTION/vm/” appeared twice in folder path)?
- How can I avoid this situation in order terraform to find the folder?