From e5d4c577f82e6ea50225d295a7b56f4533cf40d3 Mon Sep 17 00:00:00 2001 From: djpbessems Date: Tue, 2 Feb 2021 13:06:52 +0100 Subject: [PATCH] Initial commit; will fail :) --- .drone.yml | 52 +++++++++++++++++++++++++++++++++ terraform/contentlibrary.tf | 28 ++++++++++++++++++ terraform/main.tf | 36 +++++++++++++++++++++++ terraform/variables.tf | 29 +++++++++++++++++++ terraform/vm.tf | 57 +++++++++++++++++++++++++++++++++++++ terraform/vsphere.tfvars | 9 ++++++ 6 files changed, 211 insertions(+) create mode 100644 .drone.yml create mode 100644 terraform/contentlibrary.tf create mode 100644 terraform/main.tf create mode 100644 terraform/variables.tf create mode 100644 terraform/vm.tf create mode 100644 terraform/vsphere.tfvars diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..a7fd497 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,52 @@ +kind: pipeline +type: kubernetes +name: Terraform + +steps: +- name: Terraform Init + image: bv11-cr01.bessems.eu/library/packer-extended + commands: + - | + terraform init \ + -chdir=terraform \ + -input=false \ + -backend-config="conn_str=${PG_CONNECTIONSTRING}" + environment: + PG_CONNECTIONSTRING: postgres://${PG_USERNAME}:${PG_PASSWORD}@${PG_HOST}/${PG_DATABASE}?sslmode=disable + PG_HOST: tfstate.default.svc.cluster.local + PG_DATABASE: terraform_backend + PG_USERNAME: terraform + PG_PASSWORD: terraform + TF_AUTOMATION: yes + # TF_LOG: TRACE +- name: Terraform Plan + image: bv11-cr01.bessems.eu/library/packer-extended + commands: + - | + terraform plan \ + -var='vsphere_password=$${VSPHERE_PASSWORD}' -var='repo_username=$${REPO_USERNAME}' -var='repo_password=$${REPO_PASSWORD}' \ + -var-file='vsphere.tfvars' \ + -chdir=terraform \ + -input=false \ + -out=terraform.plan + environment: + TF_AUTOMATION: yes + VSPHERE_PASSWORD: + from_secret: vsphere_password + REPO_USERNAME: + from_secret: repo_username + REPO_PASSWORD: + from_secret: repo_password + # TF_LOG: TRACE +- name: Terraform Apply + image: bv11-cr01.bessems.eu/library/packer-extended + commands: + - | + terraform apply \ + -chdir=terraform \ + -input=false \ + -auto-approve \ + terraform.plan + environment: + TF_AUTOMATION: yes + # TF_LOG: TRACE diff --git a/terraform/contentlibrary.tf b/terraform/contentlibrary.tf new file mode 100644 index 0000000..63d41f4 --- /dev/null +++ b/terraform/contentlibrary.tf @@ -0,0 +1,28 @@ +resource "vsphere_content_library" "library" { + name = "OVA appliances" + storage_backing = flatten([ + data.vsphere_datastore.cldatastore.id + ]) +} + +resource "vsphere_content_library_item" "Server2019" { + name = "Windows-Server-2019-LTSC" + library_id = vsphere_content_library.library.id + file_url = "https://{{user `repo_username`}}:{{user `repo_password`}}@sn.itch.fyi/Repository/rel/Windows-Server-2019-LTSC.ova" +} +resource "vsphere_content_library_item" "ADCS" { + name = "ADCS-appliance" + library_id = vsphere_content_library.library.id + file_url = "https://{{user `repo_username`}}:{{user `repo_password`}}@sn.itch.fyi/Repository/rel/ADCS-appliance.ova" +} +resource "vsphere_content_library_item" "ADDS" { + name = "ADDS-appliance" + library_id = vsphere_content_library.library.id + file_url = "https://{{user `repo_username`}}:{{user `repo_password`}}@sn.itch.fyi/Repository/rel/ADDS-appliance.ova" +} + +resource "vsphere_content_library_item" "Win10" { + name = "Windows 10" + library_id = vsphere_content_library.library.id + file_url = "https://{{user `repo_username`}}:{{user `repo_password`}}@sn.itch.fyi/Repository/rel/Windows10.ova" +} \ No newline at end of file diff --git a/terraform/main.tf b/terraform/main.tf new file mode 100644 index 0000000..7b489e3 --- /dev/null +++ b/terraform/main.tf @@ -0,0 +1,36 @@ +terraform { + backend "pg" {} +} + +provider "vsphere" { + version = "1.24.1" + + vsphere_server = var.vcenter_server + user = var.vsphere_username + password = var.vsphere_password + + allow_unverified_ssl = true +} + +data "vsphere_datacenter" "dc" { + name = var.vsphere_datacenter +} + +data "vsphere_resource_pool" "pool" { + name = "/${var.vsphere_datacenter}/host/${var.vsphere_hostip}/Resources" + datacenter_id = data.vsphere_datacenter.dc.id +} + +data "vsphere_datastore" "vmdatastore" { + name = var.vsphere_vmdatastore + datacenter_id = data.vsphere_datacenter.dc.id +} +data "vsphere_datastore" "cldatastore" { + name = var.vsphere_cldatastore + datacenter_id = data.vsphere_datacenter.dc.id +} + +data "vsphere_network" "network" { + name = var.vsphere_network + datacenter_id = data.vsphere_datacenter.dc.id +} \ No newline at end of file diff --git a/terraform/variables.tf b/terraform/variables.tf new file mode 100644 index 0000000..f0f51c1 --- /dev/null +++ b/terraform/variables.tf @@ -0,0 +1,29 @@ +variable "vcenter_server" { +} + +variable "vsphere_username" { +} + +variable "vsphere_password" { +} + +variable "vsphere_datacenter" { +} + +variable "vsphere_host" { +} + +variable "vsphere_hostip" { +} + +variable "vsphere_datastore" { +} + +variable "vsphere_folder" { +} + +variable "vsphere_templatefolder" { +} + +variable "vsphere_network" { +} \ No newline at end of file diff --git a/terraform/vm.tf b/terraform/vm.tf new file mode 100644 index 0000000..b8ba9c6 --- /dev/null +++ b/terraform/vm.tf @@ -0,0 +1,57 @@ +resource "vsphere_virtual_machine" "TF-Windows2019" { + name = "TF-Windows2019" + resource_pool_id = data.vsphere_resource_pool.pool.id + datastore_id = data.vsphere_datastore.datastore.id + folder = var.vsphere_vmfolder + + num_cpus = 2 + memory = 4096 + + network_interface { + network_id = data.vsphere_network.network.id + } + + disk { + label = "disk0" + unit_number = 0 + size = 150 + thin_provisioned = true + } + disk { + label = "disk1" + unit_number = 1 + size = 225 + thin_provisioned = true + } + + vapp { + properties = { + "guestinfo.hostname" = "<>" + "guestinfo.ipaddress" = "<>" + "guestinfo.netmask" = "<>" + "guestinfo.gateway" = "<>" + "guestinfo.dns" = "<>" + "guestinfo.domain_name" = "<>" + "guestinfo.ntp" = "<>" + "guestinfo.enable_domain_join" = "<>" + "guestinfo.domain_short_name" = "<>" + "guestinfo.domain_join_user" = "<>" + "guestinfo.domain_join_password" = "<>" + "guestinfo.domain_controller" = "<>" + "guestinfo.viadmin_password" = "<>" + "guestinfo.viuser_password" = "<>" + "guestinfo.viservice_password" = "<>" + "guestinfo.project_name" = "<>" + "guestinfo.monitor_server" = "<>" + } + } + + clone { + template_uuid = vsphere_content_library_item.Server2019.id + } + + # # This does not actually achieve protection from destruction, see https://github.com/hashicorp/terraform/issues/17599 + # lifecycle { + # prevent_destroy = true + # } +} \ No newline at end of file diff --git a/terraform/vsphere.tfvars b/terraform/vsphere.tfvars new file mode 100644 index 0000000..8304e75 --- /dev/null +++ b/terraform/vsphere.tfvars @@ -0,0 +1,9 @@ +vcenter_server = "bv11-vc01.bessems.lan" +vsphere_username = "administrator@vsphere.local" +vsphere_datacenter = "DeSchakel" +vsphere_host = "bv11-esx.bessems.eu" +vsphere_hostip = "192.168.11.200" +vsphere_vmdatastore = "Datastore02.SSD" +vsphere_cldatastore = "Datastore01.NAS" +vsphere_vmfolder = "/Terraform" +vsphere_network = "LAN"