From 2b17edc92b136e332d7b38ad742fc804221305a0 Mon Sep 17 00:00:00 2001 From: polsevev Date: Sun, 29 Sep 2024 16:08:48 +0200 Subject: [PATCH] Terraform writeup --- .../homelab/images/i-have-homelab.webp | Bin 0 -> 28762 bytes src/content/homelab/terraform.md | 138 ++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 src/content/homelab/images/i-have-homelab.webp create mode 100644 src/content/homelab/terraform.md diff --git a/src/content/homelab/images/i-have-homelab.webp b/src/content/homelab/images/i-have-homelab.webp new file mode 100644 index 0000000000000000000000000000000000000000..7db6e8317f016bf4fabd2c66cd673364e299da3c GIT binary patch literal 28762 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 VMR0ObYFFpuxt7&=!g7I3XaMp(fSmvU literal 0 HcmV?d00001 diff --git a/src/content/homelab/terraform.md b/src/content/homelab/terraform.md new file mode 100644 index 0000000..ab9ce0a --- /dev/null +++ b/src/content/homelab/terraform.md @@ -0,0 +1,138 @@ +--- +title: Terraform + Proxmox = <3 +description: Using Terraform to deploy Virtual Machines +pubDate: 08.03.2024 +--- + +## I am tired of UIs + +Up until now, every time i wanted to deploy a VM in my homelab i did it with the Proxmox GUI. Don't get me wrong, the GUI is nice, but i would like to not have to repeat the same mundane task every time i want a new VM. +There is an argument to be made that i probably shouldn't run that many VMs, and that for the number of VMs i need, this isn't worth it. However, being able to deploy a VM by just changing a few variables in a file and running `terraform apply` just tickles something in my nerd brain. + +I also really like the repeatability of this, as i use these VM definitions to deploy K3S hosts, docker hosts and others where i want a "default" setup. + +## Initial requirements + +To use Terraform with Proxmox we use a privoder created by [Telmate](https://github.com/Telmate/terraform-provider-proxmox). We create the initial `provider.tf` file as so: +```json +terraform { + required_providers { + proxmox = { + source = "telmate/proxmox" + version = "3.0.1-rc3" + } + } +} + +variable "proxmox_api_url" { + type = string +} + +variable "proxmox_user" { + type = string + sensitive = true +} + +variable "proxmox_password" { + type = string + sensitive = true +} + +variable "ssh_public_key" { + type = string +} + +provider "proxmox"{ + pm_api_url = var.proxmox_api_url + pm_user = var.proxmox_user + pm_password = var.proxmox_password + pm_tls_insecure = true + pm_otp = "" +} +``` + +I have stored all secrets to access the proxmox API in custom variables located in a `.auto.tfvars` file that i do not track in git. Those variables are defined in the provider such that if they are not present Terraform will complain. + +In this step i had some trouble, as you can see i use a release candidate version. There seems to be a bug in version `2.9.3`, and instead of trying to track it down i just switched to release candidate. + +## Defining the virtual machine + +Now as i mentioned previously, i already have templates created in my proxmox cluster (i made these with Ansible). Therefore i can use these as a base for the provisioning of a new VM. + +Here is an example definition of a VM + +```terraform +resource "proxmox_vm_qemu" "havneboks" { + name = "havneboks" + desc = "Docker master" + target_node = "poseidon" + + agent = 1 + onboot = true + + clone = "VM 9001" + cores = 4 + sockets = 1 + cpu = "host" + memory = 3096 + + # Setup the disk + disks { + ide { + ide2 { + cloudinit { + storage = "basseng" + } + } + } + scsi { + scsi0 { + disk { + size = "10G" + storage = "basseng" + } + } + } + } + + + network { + bridge = "vmbr0" + model = "virtio" + } + scsihw = "virtio-scsi-pci" + os_type = "cloud-init" + ipconfig0 = "ip=192.168.1.51/24,gw=192.168.1.1" + nameserver = "192.168.1.69" + ciuser = "ansible" + sshkeys = var.ssh_public_key +} +``` + +A VM is defined using the resource type of `proxmox_vm_qemu` with a name. I really like to use the names of the service just translated to norwegian, so in this case, this VM is called `havneboks` (meaning docker box). + +- name: The name of the VM (hostname) +- desc: A description of the VM +- target_node: Which node in the cluster should the VM be provisioned to, in this case i provision it to the node `poseidon`(hostname) +- agent: Just select 1 +- onboot: Set the VM to start when the host boots +- clone: Which template to clone the VM from +- cores: How much horsepowa u want? +- sockets: I only got 1 cpu in each of my boxes +- memory: How much RAM u want? + +Now, a really important part of this is the disk setup, as you have to mimic the setup of the template (sizes can be chosen freely). So in my case, i have the cloud-init disk on `ide2` and the OS disk on `scsi0` in the template. Therefore we create the same exact setup for this resource. + +- network: Just mimic the cloud-init +- scsihw: Which hardware do you want the host system to use to provide scsi? +- os_type: I use cloud-init, so we select cloud-init +- ipconfig: Now this is quite interesting, you should set a static IP and gateway such that the VM starts with a proper IP adress (you can also use DHCP here) +- namesever: I use a custom dns on adress `.69`(nice) so i set that, but if this is not set it will use "same as host" +- ciuser: A user to be created by cloud-init for this VM +- sshkeys: Initial SSH public keys to allow access. This is stored in a variable in my case. + +## Just run? + +Bing bang bom. You can now deploy your VM fully automatically and about 43 seconds later access it via SSH. Now all i did was configure it with ansible, and i have a fully reproducible homelab setup. + +![](./images/i-have-homelab.webp) \ No newline at end of file