Deploying a VM on VMware (ESXi01 / ESXi02 via vCenter01) Using Terraform

 In this blog, we will implement a Virtual Machine using Terraform in a VMware environment consisting of:

  • ESXi01

  • ESXi02

  • vCenter01

We will also cover:

✔ Downloading Terraform EXE (Windows)
✔ Creating working directory C:\terraform-vsphere
✔ Creating main.tf file
✔ Connecting to vCenter01
✔ Deploying VM from Template


🏗️ VMware Lab Architecture

Environment Details



ComponentName
vCentervcenter01
ESXi HostsESXi01, ESXi02
Datacenterdarole-dc
Clustermy-cluster
Datastoreesxi02-datastore01
NetworkVM Network VM Network 2
Templateubuntu



🌍 What is Terraform?

Terraform is an Infrastructure as Code (IaC) tool primarily designed for Cloud Infrastructure (AWS, Azure, GCP).

Although it supports VMware via the vSphere provider, it is more optimized for cloud platforms.


💻 Step 1: Download Terraform (Windows)

1️⃣ Open browser
2️⃣ Go to:
👉 https://developer.hashicorp.com/terraform/downloads

3️⃣ Download Windows AMD64 ZIP

4️⃣ Extract terraform.exe


📁 Step 2: Create Working Directory

Open Command Prompt:

C:
mkdir terraform-vsphere
cd terraform-vsphere

Your working path should look like:

C:\terraform-vsphere>

Now copy terraform.exe into:

C:\terraform-vsphere\

Verify:

terraform version

If successful, Terraform version will display.


📄 Step 3: Create main.tf File

Inside:

C:\terraform-vsphere>

Create a file:

main.tf

You can use:

notepad main.tf

📝 Complete main.tf Configuration

Paste the below configuration:

############################################################ # TERRAFORM SETTINGS ############################################################ terraform { required_version = ">= 1.3" required_providers { vsphere = { source = "hashicorp/vsphere" version = "~> 2.5" } } } ############################################################ # PROVIDER ############################################################ provider "vsphere" { user = "administrator@vsphere.local" password = "Pass@1234" vsphere_server = "vcenter01.darole.org" allow_unverified_ssl = true } ############################################################ # DATA SOURCES ############################################################ data "vsphere_datacenter" "dc" { name = "darole-dc" } data "vsphere_compute_cluster" "cluster" { name = "my-cluster" datacenter_id = data.vsphere_datacenter.dc.id } data "vsphere_datastore" "datastore" { name = "esxi02-datastore01" datacenter_id = data.vsphere_datacenter.dc.id } data "vsphere_network" "network" { name = "VM Network" # 🔥 Change if your portgroup name is different datacenter_id = data.vsphere_datacenter.dc.id } data "vsphere_network" "network2" { name = "VM Network 2" # 🔥 Change if your portgroup name is different datacenter_id = data.vsphere_datacenter.dc.id } data "vsphere_virtual_machine" "template" { name = "ubuntu" datacenter_id = data.vsphere_datacenter.dc.id } ############################################################ # FOLDER (Auto Create) ############################################################ resource "vsphere_folder" "vm_folder" { path = "ans01-vm" type = "vm" datacenter_id = data.vsphere_datacenter.dc.id } ############################################################ # VIRTUAL MACHINE ############################################################ resource "vsphere_virtual_machine" "vm" { name = "ans01-vm" folder = vsphere_folder.vm_folder.path resource_pool_id = data.vsphere_compute_cluster.cluster.resource_pool_id datastore_id = data.vsphere_datastore.datastore.id num_cpus = 1 memory = 1024 guest_id = data.vsphere_virtual_machine.template.guest_id scsi_type = data.vsphere_virtual_machine.template.scsi_type network_interface { network_id = data.vsphere_network.network.id adapter_type = "vmxnet3" } network_interface { network_id = data.vsphere_network.network2.id adapter_type = "vmxnet3" } disk { label = "disk0" size = data.vsphere_virtual_machine.template.disks[0].size thin_provisioned = true } clone { template_uuid = data.vsphere_virtual_machine.template.id } } ############################################################ # OUTPUTS ############################################################ output "vm_name" { value = vsphere_virtual_machine.vm.name } output "vm_uuid" { value = vsphere_virtual_machine.vm.uuid } output "vm_ip" { value = vsphere_virtual_machine.vm.default_ip_address }

Save and close.


▶️ Step 4: Initialize and Deploy

From:

C:\terraform-vsphere>

Run:

terraform init
terraform plan
terraform apply

Type:

yes

Terraform will:




⚠️ Observations (Real Lab Experience)

In VMware environment, I observed:

  • VM shutdown did not work properly via Terraform

  • IP address detection sometimes delayed

  • Slower build time compared to Ansible

Because Terraform is more cloud-focused, VMware automation sometimes feels slower compared to:

Ansible


🔄 Terraform vs Ansible (VMware Use Case)

FeatureTerraformAnsible
Cloud Infra⭐⭐⭐⭐⭐⭐⭐⭐
VMware Automation⭐⭐⭐⭐⭐⭐
SpeedSlowerFaster
Power OperationsLimitedFlexible

🏁 Conclusion

We successfully:

✔ Downloaded Terraform EXE
✔ Created C:\terraform-vsphere
✔ Created main.tf
✔ Connected to vCenter01
✔ Deployed VM on ESXi cluster

Terraform works, but in pure VMware environments, Ansible may offer better flexibility and speed.

No comments:

Post a Comment