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 terraformCreate 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:


