Tự động hóa Proxmox với Terraform: Từ ‘Click-ops’ tay chân sang IaC chuyên nghiệp

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

Nỗi ám ảnh mang tên ‘Click-ops’

Mình đang vận hành một hệ thống homelab trên Proxmox VE với khoảng 12 máy ảo (VM) và container. Đây là nơi mình thử nghiệm đủ thứ, từ cụm Kubernetes, Home Assistant đến các bot tự động hóa.

Ban đầu, việc vào Web UI của Proxmox để chọn ISO, cấu hình CPU và RAM cho 1-2 máy ảo là chuyện nhỏ. Tuy nhiên, mọi thứ trở thành cực hình khi mình cần dựng nhanh một cụm K3s 3 node hoặc reset môi trường lab liên tục.

Việc click chuột lặp đi lặp lại không chỉ gây nhàm chán mà còn cực kỳ dễ sai sót. Chỉ cần quên bật QEMU Agent hoặc cấu hình sai VLAN là bạn sẽ mất thêm 15-20 phút để debug. Để thoát khỏi cảnh này, Infrastructure as Code (IaC) chính là lối thoát duy nhất cho hạ tầng của bạn.

Tại sao chọn Terraform thay vì dùng Script hay Ansible?

Có nhiều cách để điều khiển Proxmox từ xa như dùng pvesh, API hoặc module của Ansible. Thế nhưng, Terraform vẫn có chỗ đứng riêng nhờ những ưu điểm vượt trội:

  • Scripting (Bash/Python): Thường thiếu khả năng quản lý trạng thái (state). Nếu bạn chạy script lần hai, nó có thể tạo thêm một VM trùng lặp thay vì cập nhật cái cũ.
  • Ansible: Rất mạnh trong việc cài đặt phần mềm (Configuration Management). Tuy nhiên, ở khâu khởi tạo tài nguyên phần cứng (Provisioning), Ansible xử lý thường không mượt và rành mạch bằng Terraform.

Terraform quản lý hạ tầng thông qua State file. Nó hiểu rõ hệ thống hiện tại đang có gì. Khi bạn tăng RAM từ 2GB lên 4GB trong code, Terraform sẽ chỉ thực hiện đúng lệnh nâng cấp thay vì xóa đi xây lại từ đầu.

Chuẩn bị những gì?

Trước khi bắt tay vào viết code, bạn cần chuẩn bị sẵn 3 yếu tố sau:

  1. Proxmox API Token: Tuyệt đối không dùng user root. Hãy tạo API Token riêng với quyền PVEVMAdmin để đảm bảo an toàn.
  2. Terraform: Cài đặt sẵn trên máy cá nhân hoặc một máy quản lý trung gian.
  3. Cloud-init Image: Đây là yếu tố sống còn. Để Terraform tự nạp IP và SSH key mà không cần chạm tay vào bàn phím VM, bạn phải tạo máy ảo từ một Cloud-init template.

Bước 1: Khởi tạo API Token

Bạn truy cập vào Datacenter > Permissions > API Tokens trên giao diện Proxmox. Sau khi tạo token cho user (ví dụ: terraform-user), hãy lưu lại Secret ID ngay. Lưu ý là nó chỉ xuất hiện một lần duy nhất trên màn hình thôi.

Bước 2: Cấu hình Terraform Provider

Trong hệ sinh thái Proxmox, provider của Telmate vẫn là lựa chọn phổ biến nhất nhờ cộng đồng hỗ trợ đông đảo.

Bạn tạo file main.tf với nội dung khai báo nhà cung cấp như sau:

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

provider "proxmox" {
  pm_api_url      = "https://192.168.1.100:8006/api2/json"
  pm_api_token_id = "terraform-user@pve!mytoken"
  pm_api_token_secret = "your-very-secret-token"
  pm_tls_insecure = true 
}

Triển khai máy ảo đầu tiên

Kinh nghiệm của mình là đừng bao giờ cài VM từ file ISO trắng khi dùng Terraform. Hãy chuẩn bị một VM Template đã cài sẵn Cloud-init để Terraform thực hiện clone.

Dưới đây là đoạn code mẫu để tạo nhanh một máy ảo Ubuntu Server:

resource "proxmox_vm_qemu" "ubuntu_server" {
  count       = 1
  name        = "vm-terraform-${count.index}"
  target_node = "pve-node-01"
  clone       = "ubuntu-22.04-template"

  cores   = 2
  sockets = 1
  memory  = 2048
  agent   = 1 # Cho phép Proxmox lấy IP từ VM

  disk {
    size    = "20G"
    type    = "scsi"
    storage = "local-lvm"
  }

  network {
    model  = "virtio"
    bridge = "vmbr0"
  }

  os_type = "cloud-init"
  ipconfig0 = "ip=192.168.1.5${count.index}/24,gw=192.168.1.1"
  sshkeys = <<EOF
  ssh-rsa AAAAB3NzaC1yc2E... your-public-key
  EOF
}

Quy trình vận hành 3 bước

Sau khi chuẩn bị code xong, quy trình làm việc của bạn sẽ gói gọn trong 3 lệnh:

  1. terraform init: Tải các plugin cần thiết về máy.
  2. terraform plan: Xem trước các thay đổi. Đây là bước quan trọng để đảm bảo bạn không vô tình xóa mất dữ liệu quan trọng.
  3. terraform apply: Xác nhận triển khai thực tế.

Thực tế cho thấy, việc dùng lệnh giúp mình tạo xong một VM chỉ trong 45 giây. Nếu làm thủ công bằng tay, con số này thường rơi vào khoảng 5 đến 10 phút cho mỗi máy.

Vài lưu ý ‘xương máu’ cho anh em

Trong quá trình làm IaC với Proxmox, mình đã rút ra vài bài học để tránh làm hỏng hệ thống:

  • Bảo mật file .tfstate: File này chứa toàn bộ cấu hình hạ tầng, thậm chí là mật khẩu ở dạng văn bản thuần. Tuyệt đối không commit nó lên GitHub công khai.
  • Tận dụng biến (Variables): Đừng viết cứng IP hay Token vào code. Hãy tách chúng ra file variables.tf để dễ dàng quản lý và bảo mật hơn.
  • Quản lý VM ID: Proxmox dùng ID (như 100, 101) để định danh. Để tránh xung đột với các VM tạo tay, bạn nên quy hoạch một dải ID riêng cho Terraform (ví dụ từ 500 trở đi).

Lời kết

Kết hợp Terraform và Proxmox không chỉ dành cho môi trường doanh nghiệp. Ngay cả với homelab, cách làm này giúp bạn rèn luyện tư duy hệ thống và khả năng tái bản (reproducibility) cực tốt.

Nếu server gặp sự cố, bạn chỉ cần một lệnh duy nhất để khôi phục toàn bộ dàn máy ảo y hệt như cũ. Đừng ngần ngại thử nghiệm IaC ngay hôm nay, thành quả về năng suất chắc chắn sẽ khiến bạn bất ngờ.

Share: