Terraform
Terraform
De beste omschrijving van wat Terraform voor tool is, vind ik dat Terraform een tool is om weer een config interface te bieden voor APIs. Hashicorp gebruikt hiervoor een eigen HCL config taaltje. De kracht van Terraform komt door de vele beschikbare providers. De providers bieden de API interactie en maken de bronnen beschikbaar. De meeste providers zijn beschikbaar via de Terraform Registry.
Terraform en Proxmox Provider
Proxmox VE is een server management platform voor KVM virtual machines en LXC containers. In dit voorbeeld geef ik aan hoe je hiermee eenvoudig en snel virtual machines kunt uitrollen d.m.v. Terraform.
De Proxmox Terraform provider kan eenvoudig van de Terraform Registry worden gehaald door deze op te nemen in een Terraform configuratie file.
terraform {
required_providers {
proxmox = {
source = "Telmate/proxmox"
version = "2.6.5"
}
}
}
Om de plugin lokaal beschikbaar te houden kun je het volgende opnemen in de .terraformrc file:
plugin_cache_dir = "$HOME/.terraform.d/plugin-cache" disable_checkpoint = true
Met een terraform init wordt de plugin geinstalleerd.
De Proxmox provider maakt gebruik van cloud-init images. Deze kun je eenvoudig aanmaken in Proxmox door een VM te starten met een Linux installatie. Hierna maak hier een template van.
Voor Debian maak je een VM aan met minimaal 512MB, seabios en een eenvoudige diskpartie (dan kan cloud-init eenvoudig partitie vergroten). Debian gebruikt de passwordless user debian en gebruikt nog de normale installer. Hierbij moet je de volgende packages nog toevoegen.
apt install cloud-init cloud-utils cloud-initramfs-growroot -y
Ubuntu gebruikt de passwordless user ubuntu en gebruikt de cloud-init installer waarbij je een aantal cloud-init config files moet weghalen voor je de template maakt.
/etc/cloud/cloud.cfg.d/*.cfg passwd --delete ubuntu
Maak de ssh key aan voor je bastion host.
Je kunt nu een Terraform config file maken om een aantal VMs te beschrijven: main-ubu.tf
terraform {
required_providers {
proxmox = {
source = "Telmate/proxmox"
version = "2.6.5"
}
}
}
provider "proxmox" {
# Configuration options
pm_api_url = "https://10.10.10.10:8006/api2/json"
pm_user = "user@pve"
pm_password = "password"
pm_tls_insecure = "true"
}
variable "ssh_key" {
default = "ssh-rsa Bastion host ssh public key"
}
resource "proxmox_vm_qemu" "proxmox_vm" {
count = 3
name = "ubu20-10${count.index + 1}"
target_node = "proxmox"
clone = "ubu20-cloudk"
os_type = "cloud-init"
cores = 2
sockets = 1
memory = 8192
scsihw = "virtio-scsi-pci"
bootdisk = "scsi0"
disk {
type = "scsi"
storage = "local-lvm"
size = "40G"
iothread = true
}
network {
model = "virtio"
bridge = "vmbr0"
}
lifecycle {
ignore_changes = [
network,
]
}
# Cloud Init Settings
ipconfig0 = "ip=10.10.10.11${count.index + 1}/24,gw=10.10.10.254"
sshkeys = <<EOF
${var.ssh_key}
EOF
}
Plan de config om te kijken wat er moet worden uitgevoerd door Terraform.
terraform plan
Voer het plan uit, waarbij de config wordt uitgevoerd.
terraform apply -parallelism=1
Standaard voert Terraform 10 parallelle acties uit. Dit gaat niet goed met de Proxmox provider.
