Terraform x Proxmox

Terraform คือ IaC tool ที่จะสามารถสร้าง, แก้ไข, ทำลาย infrastructure ได้ ทำงานผ่าน API แถมตัว code อ่านง่าย (YAML) และรองรับหลากหลาย provider ซึ่งในที่นี้ผมจะใช้กับ Proxmox เพื่อให้ provision QEMU VMs และ LXC Containers ครับ.

สวัสดีครับ วันนี้เบื่อจะสร้าง VM ผ่าน Proxmox GUI แล้วครับ

Terraform?

Terraform คือ IaC tool ที่จะสามารถสร้าง, แก้ไข, ทำลาย infrastructure ได้ ทำงานผ่าน API แถมตัว code อ่านง่าย (YAML) และรองรับหลากหลาย provider ซึ่งในที่นี้ผมจะใช้กับ Proxmox เพื่อให้ provision QEMU VMs และ LXC Containers ครับ.

Why?

เพราะคุณคงไม่ชอบใจแน่ๆ ถ้าวันๆนึงคุณต้องสร้าง VM หรือ ลบ VM เป็น 10 เครื่องด้วยการคลิ๊กผ่าน GUI ทั้งนี้เมื่อทำทุกอย่างให้เป็น script เราก็จะสามารถ automate ได้หรือเช็คย้อนหลังได้ว่าเราทำอะไรไปบ้าง ทั้งยังลด human error ด้วย

Howto

ก่อนอื่นเราต้องมี Proxmox server และ cloud init image os เมื่อมีครบแล้ว ก็มาติดตั้ง terraform กัน ในที่นี้ผมใช้ Ubuntu ครับ

wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform

Create tf user on Proxmox

ในการที่จะให้ Terraform (จากนี้จะเรียกว่า tf) เข้าถึง server ได้ ต้องมี user หรือ API token ครับซึ่งผมจะใช้ API Token แต่การจะมี API token ก็ต้องสร้าง user ก่อน มาสร้าง user กัน

Gen token

Setup Proxmox Roles

เพื่อจำกัดการใช้งานเท่าที่จำเป็น สร้าง role TerraformProv และให้สิทธ์เท่าที่จำเป็นครับ

pveum role add TerraformProv -privs "Datastore.AllocateSpace Datastore.Audit Pool.Allocate Sys.Audit Sys.Console Sys.Modify VM.Allocate VM.Audit VM.Clone VM.Config.CDROM VM.Config.Cloudinit VM.Config.CPU VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.Migrate VM.Monitor VM.PowerMgmt"

Terraform provider install

ในการใช้งาน terraform จะมีอยู่ 3 stage คือ init, plan, apply มาเริ่มที่ init กัน

mkdir proxmox-tf && cd proxmox-tf
touch main.tf vars.tf

สร้าง main.tf และ var.tf ขึ้นมา (จริงๆจะใช้แค่ main.tf ก็ได้ แต่ best practice แนะนำให้ใช้ var.tf ในการเก็บค่า

edit main.tf เพื่อ config provider (อย่าลืมเช็คและเปลี่ยน version นะครับ)

root@AdamandEve:~/proxmox-tf# cat main.tf
terraform {
  required_providers {
    proxmox = {
      source = "telmate/proxmox"
      version = "2.9.10"
    }
  }
}

provider "proxmox" {
  # Configuration options
}

จากนั้น init ครับ เพื่อถึงข้อมูล provider จาก server

terraform init

จากนั้น edit main.tf อีกรอบ ตามด้วย var.tf

terraform {
  required_providers {
    proxmox = {
      source = "telmate/proxmox"
      version = "2.7.10"
    }
  }
}

provider "proxmox" {
  # url หรือ ip ของ proxmox server 
  pm_api_url = "https://your-ip:8006/api2/json"

  # api token id
  pm_api_token_id = "yourtfuser@pam!for_terraform"

  # secret ที่ได้มาตอน gen token
  pm_api_token_secret = "xxxxx-xxxxxx-xxxxxx-xxxxxx"

  # ถ้าคุณใช้ https + cert 
  pm_tls_insecure = true
}

# resource ถูกระบุให้อยู่ใน [type] [entity_name] ในตัวอย่างเราจะสร้าง resource [type]proxmox_vm_qemu [entity_name]test_server นะครับ
resource "proxmox_vm_qemu" "test_server" {
  count = 1 # จำนวน vm
  name = "test-vm-${count.index + 1}" #อันนี้การตั้งชื่อ count.index จะเริ่มที่ at 0, เพราะฉะนั้นเราน่าจะได้ vm ชื่อ test-vm-0

  # node ที่เราต้องการให้ deploy ครับ
  target_node = "pve1"


  # อยู่ในไฟล์ var.tf ชื่อว่า "ubuntu-2004-cloudinit-template"
  clone = var.template_name

  # basic VM settings. agent ในที่นี้หมายถึง qemu agent 0=ปิด 1=เปิด
  agent = 1
  os_type = "cloud-init"
  cores = 2
  sockets = 1
  cpu = "host"
  memory = 2048
  scsihw = "virtio-scsi-pci"
  bootdisk = "sata0"

  disk {
    slot = 0
    size = "10G"
    type = "sata"
    storage = "local-zfs"
    iothread = 1
  }
  
  # NIC
  network {
    model = "virtio"
    bridge = "vmbr0"
  }

  # ผมไม่ชัวร์
  lifecycle {
    ignore_changes = [
      network,
    ]
  }
}

main.tf

variable "template_name" {
    default = "ubuntu-2004-cloudinit-template"
}

var.tf

จริงๆจะใส่ token ไว้ใน var.tf ก็ได้นะครับ (และควรทำด้วย) ยังมีการตั้งค่าอื่นๆอีกนะครับ แต่อันนี้เป็นพื้นฐาน เอาเท่านี้ก่อน

เมื่อพร้อมแล้ว spin this !

terraform plan

เมื่อ execute command ก็จะได้ข้อมูลแบบนี้ครับ คือบอกว่าจะทำอะไรบ้าง ตรวจสอบแล้วโอเค ก็ apply ครับ

terraform apply

Summary

เรียบร้อยแล้วครับ เท่านี้ก็จะได้เครื่องมือที่ใช้ deploy infra แล้ว

Ref:

No comments yet