Tuyệt chiêu dùng HashiCorp Packer: Tự động hóa build Template Proxmox và VMware

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

Đừng làm nô lệ cho việc cài OS thủ công

Ngày đầu đi làm, nỗi ám ảnh lớn nhất của mình là ngồi “vê” (cài) máy ảo. Cứ mỗi lần team dev cần một con Ubuntu hay CentOS mới, mình lại lạch cạch mount file ISO, bấm Next mỏi tay, đặt tên user, rồi chép SSH key… Làm một hai con thì không sao, chứ tới con thứ 10 trong ngày là bắt đầu thấy oải.

Hiện tại mình đang quản lý một cụm Homelab Proxmox với hơn 15 VM lớn nhỏ. Nếu vẫn giữ thói quen cài tay, mình sẽ tốn khoảng 30 phút cho mỗi con server. Chưa kể việc cấu hình repo hay tắt Firewall rất dễ bị sót. Đó là lý do mình chuyển hẳn sang HashiCorp Packer. Công cụ này giúp bạn biến quy trình cài đặt thành những dòng code sạch sẽ (Infrastructure as Code). Chỉ cần gõ một lệnh, đi pha ly cafe quay lại là template đã sẵn sàng trên Proxmox.

Cài đặt Packer chỉ trong 3 nốt nhạc

Bạn có thể cài Packer lên bất kỳ máy nào, từ Windows, Mac đến Linux. Nếu đang dùng Ubuntu, hãy quăng mớ lệnh này vào terminal:

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 packer

packer version để chắc chắn mọi thứ đã ổn. Sau đó, hãy tạo một thư mục riêng để chứa dự án đầu tay của bạn:

mkdir packer-lab && cd packer-lab
touch ubuntu-2204.pkr.hcl

Đừng quên chạy lệnh packer init . để nó tự tải các plugin cần thiết về máy nhé.

Bên dưới lớp vỏ: Packer vận hành thế nào?

Nhiều bạn lầm tưởng Packer sẽ cài đè lên máy có sẵn. Thực tế, quy trình của nó rất chuyên nghiệp:

  1. Khởi tạo VM tạm: Packer ra lệnh cho Proxmox/VMware tạo một máy ảo mới hoàn toàn từ file ISO gốc.
  2. Tự động điền form: Nó dùng các file user-data (Cloud-init) để tự động trả lời các câu hỏi cài đặt OS (múi giờ, ngôn ngữ, ổ đĩa).
  3. Chạy kịch bản cài cắm: Sau khi OS lên, Packer SSH vào để cài thêm Docker, Nginx hoặc Agent giám sát theo ý bạn.
  4. “Đúc” Template: Cuối cùng, nó tắt máy, chuyển đổi thành Template và dọn dẹp sạch sẽ các file rác.

HCL (HashiCorp Configuration Language) là ngôn ngữ chủ đạo ở đây. Nếu bạn đã từng nghịch qua Terraform thì sẽ thấy quen như ở nhà. Trong quá trình làm việc với CI/CD, đôi khi mình cần chuyển đổi file cấu hình, mình thường dùng YAML ↔ JSON Converter để xử lý nhanh. Ưu điểm là công cụ này chạy trực tiếp trên trình duyệt nên không lo lộ các thông tin cấu hình nhạy cảm.

Thực chiến: Build Template trên Proxmox

Dưới đây là file HCL cơ bản để bạn tạo ngay một template Ubuntu. Nhớ chuẩn bị sẵn API Token trên Proxmox trước khi chạy nhé.

# ubuntu-2204.pkr.hcl

source "proxmox-iso" "ubuntu" {
  proxmox_url = "https://192.168.1.100:8006/api2/json"
  username    = "root@pam!packer_token"
  token       = "secret-cua-ban"
  
  node                 = "pve"
  iso_file            = "local:iso/ubuntu-22.04-live-server-amd64.iso"
  vm_name              = "ubuntu-2204-template"
  memory               = 2048
  cores                = 2
  
  network_adapters {
    model = "virtio"
    bridge = "vmbr0"
  }

  ssh_username = "ubuntu"
  ssh_password = "itfromzero-random-pass"
  ssh_timeout  = "20m"
}

Một mẹo nhỏ về bảo mật: Đừng bao giờ ghi thẳng (hardcode) mật khẩu vào file. Mình thường dùng Password Generator để tạo một chuỗi ngẫu nhiên rồi lưu vào biến môi trường. Điều này giúp bạn yên tâm hơn khi đẩy code lên GitHub.

Còn với VMware (vSphere) thì sao?

Cú pháp bên VMware cũng tương tự, chỉ cần thay builder sang vsphere-iso. Việc dùng chung một bộ khung cấu hình giúp server của bạn luôn đồng nhất, bất kể nó chạy trên nền tảng ảo hóa nào.

Kỹ thuật nâng cao: Cloud-init và Dọn dẹp hệ thống

Một template xịn là template có khả năng tự cấu hình khi boot. Bạn nên kết hợp Packer với Cloud-init để nạp sẵn SSH key. Ngoài ra, hãy dùng provisioner "shell" để tối ưu hóa OS ngay từ lúc build:

build {
  sources = ["source.proxmox-iso.ubuntu"]

  provisioner "shell" {
    inline = [
      "sudo apt-get update",
      "sudo apt-get install -y qemu-guest-agent",
      "sudo truncate -s 0 /etc/machine-id"
    ]
  }
}

Lưu ý: Lệnh xóa machine-id là bắt buộc. Nếu quên, tất cả các VM con tạo ra từ template này sẽ bị trùng ID, dẫn đến xung đột IP trong mạng DHCP cực kỳ phiền phức.

Trước khi build, hãy chắc chắn file ISO của bạn không bị lỗi. Mình thường dùng Hash Generator để kiểm tra checksum SHA-256. Thà mất 10 giây kiểm tra còn hơn tốn cả tiếng đồng hồ debug tại sao cài đặt không thành công.

Kinh nghiệm xương máu khi dùng Packer

  • Tuyệt đối không hardcode: Hãy dùng file variables.pkr.hcl cho các thông số IP, username và password.
  • Kiểm tra iso_checksum: Packer sẽ dừng ngay nếu file ISO bị hỏng, giúp bạn đỡ mất công vô ích.
  • Tận dụng Makefile: Gom các lệnh build vào Makefile để gõ cho nhanh, ví dụ make build-ubuntu.
  • Bật Log khi lỗi: Nếu build thất bại, hãy chạy PACKER_LOG=1 packer build . để thấy từng bước nó đang làm gì.

Hy vọng bài viết này giúp bạn giải phóng đôi tay khỏi việc cài máy ảo thủ công. Tự động hóa sớm ngày nào, bạn sẽ rảnh rang để nghiên cứu những thứ hay ho hơn ngày đó. Chúc các bạn thành công!

Share: