From b1de088d8736575ac1fefcab57ff673f71dd419c Mon Sep 17 00:00:00 2001 From: Philippe Caseiro Date: Wed, 5 Jul 2023 09:43:06 +0200 Subject: [PATCH] feat(vmware): adding vmware support --- modules/vmware/main.tf | 86 +++++++++++++++++++++++++++++++++++++++ modules/vmware/output.tf | 7 ++++ modules/vmware/version.tf | 8 ++++ 3 files changed, 101 insertions(+) create mode 100644 modules/vmware/main.tf create mode 100644 modules/vmware/output.tf create mode 100644 modules/vmware/version.tf diff --git a/modules/vmware/main.tf b/modules/vmware/main.tf new file mode 100644 index 0000000..9c16261 --- /dev/null +++ b/modules/vmware/main.tf @@ -0,0 +1,86 @@ +variable "vms" { + type = map(object( + { + domain = string + cpu = number + ram = number + guest_id = string + disks = map(object({ + size = string + })) + network_interfaces = list(object( + { + id = string + mac = string + } + )) + folder = string + } + )) + description = "Virtual Machines description" +} + +variable "cluster" { + type = object({ + datacenter_name = string + datastore_name = string + resource_pool_name = string + folder = string + vnets = map(object({ + name = string + })) + } + ) + description = "vSphere cluster definition" +} + +data "vsphere_datacenter" "datacenter" { + name = var.cluster.datacenter_name +} + +data "vsphere_datastore" "datastore" { + name = var.cluster.datastore_name + datacenter_id = data.vsphere_datacenter.datacenter.id +} + +data "vsphere_resource_pool" "pool" { + name = var.cluster.resource_pool_name + datacenter_id = data.vsphere_datacenter.datacenter.id +} + +data "vsphere_network" "network" { + for_each = var.cluster.vnets + + name = each.value.name + datacenter_id = data.vsphere_datacenter.datacenter.id +} + +resource "vsphere_virtual_machine" "vm" { + for_each = var.vms + name = "${each.key}.${each.value.domain}" + resource_pool_id = data.vsphere_resource_pool.pool.id + datastore_id = data.vsphere_datastore.datastore.id + folder = each.value.folder + num_cpus = each.value.cpu + memory = each.value.ram + guest_id = each.value.guest_id + + dynamic "network_interface" { + for_each = each.value.network_interfaces + //for_each = { for idx, value in each.value.network_interfaces : idx => value } + //for_each = { for idx, vnet in data.vsphere_network.network : idx => vnet } + content { + network_id = data.vsphere_network.network[network_interface.value.id].id + use_static_mac = true + mac_address = network_interface.value.mac + } + } + + dynamic "disk" { + for_each = each.value.disks + content { + label = disk.key + size = disk.value.size + } + } +} \ No newline at end of file diff --git a/modules/vmware/output.tf b/modules/vmware/output.tf new file mode 100644 index 0000000..c368c0c --- /dev/null +++ b/modules/vmware/output.tf @@ -0,0 +1,7 @@ +output "shortnames" { + value = keys(var.vms) +} + +//output "virtual_machines" { +// value = vsphere.virtual_machine.vm //template_nic[0].computed_mac) +//} \ No newline at end of file diff --git a/modules/vmware/version.tf b/modules/vmware/version.tf new file mode 100644 index 0000000..da87832 --- /dev/null +++ b/modules/vmware/version.tf @@ -0,0 +1,8 @@ +terraform { + required_providers { + vsphere = { + source = "hashicorp/vsphere" + version = "~> 2.4.0" + } + } +} \ No newline at end of file