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
| Component | Name |
|---|---|
| vCenter | vcenter01 |
| ESXi Hosts | ESXi01, ESXi02 |
| Datacenter | darole-dc |
| Cluster | my-cluster |
| Datastore | esxi02-datastore01 |
| Network | VM Network VM Network 2 |
| Template | ubuntu |
🌍 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)
| Feature | Terraform | Ansible |
|---|---|---|
| Cloud Infra | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| VMware Automation | ⭐⭐ | ⭐⭐⭐⭐ |
| Speed | Slower | Faster |
| Power Operations | Limited | Flexible |
🏁 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