Tự dựng cụm OpenTofu + Terragrunt để Deploy 100 VPS Clone tự động chuẩn GitOps
Giới thiệu xu hướng Dịch chuyển sang OpenTofu và Sức mạnh của Terragrunt
Trong kỷ nguyên số hóa, việc quản lý và vận hành hạ tầng công nghệ thông tin (IT Infrastructure) thủ công không còn đáp ứng được tốc độ phát triển của doanh nghiệp. Xu hướng Infrastructure as Code (IaC) ra đời như một lời giải bài toán quy mô. Đặc biệt, sau những thay đổi về bản quyền của HashiCorp Terraform sang BUSL, cộng đồng mã nguồn mở đã chứng kiến sự trỗi dậy mạnh mẽ của OpenTofu – một bản fork hoàn toàn mở, minh bạch và giữ nguyên sức mạnh cốt lõi của Terraform.
Tuy nhiên, khi quy mô hệ thống tăng lên đến hàng trăm VPS clone phục vụ cho các môi trường Test, Staging, hoặc Production riêng biệt, một mình OpenTofu là chưa đủ. Mã nguồn IaC dễ rơi vào trạng thái lặp đi lặp lại (boilerplate code), khó quản lý trạng thái (state) và thiếu tính module hóa sâu sắc. Đó chính là lý do Terragrunt xuất hiện. Terragrunt hoạt động như một lớp bọc (wrapper) mỏng nhưng cực kỳ mạnh mẽ phía trên OpenTofu, giúp giữ cho mã nguồn của bạn tuân thủ nghiêm ngặt nguyên lý DRY (Don't Repeat Yourself) và quản lý remote state một cách tối ưu.
Bài viết này sẽ hướng dẫn bạn từng bước tự dựng cụm OpenTofu + Terragrunt để deploy 100 VPS Clone tự động theo chuẩn GitOps, đảm bảo tính nhất quán, an toàn và dễ dàng mở rộng.
Kiến trúc Tổng quan và Mô hình GitOps áp dụng
Để triển khai 100 VPS clone thành công mà không gặp phải rủi ro xung đột cấu hình, chúng ta cần một kiến trúc phân lớp rõ ràng và một quy trình vận hành dựa trên Git (GitOps). Quy trình này đảm bảo rằng "Git là nguồn chân lý duy nhất" (Single Source of Truth). Mọi thay đổi trên hạ tầng thực tế đều phải được khai báo bằng code và kiểm duyệt thông qua Pull Request (PR).
Sơ đồ Luồng hoạt động (Workflow)
- Khai báo: Kỹ sư DevOps định nghĩa số lượng VPS, cấu hình (CPU, RAM, OS, Network) trong các file cấu hình Terragrunt (.hcl) trên Git repository.
- Kiểm duyệt (CI Pipeline): Khi có một Pull Request được tạo, hệ thống CI (GitHub Actions, GitLab CI) sẽ tự động chạy lệnh
terragrunt planđể dự báo các tài nguyên sẽ được tạo mới, thay đổi hoặc xóa bỏ. - Triển khai (CD Pipeline): Sau khi PR được duyệt và merge vào nhánh chính (main/master), webhook sẽ kích thích CD pipeline chạy lệnh
terragrunt apply --terragrunt-non-interactiveđể tiến hành tạo lập 100 VPS thực tế thông qua API của Cloud Provider (AWS, GCP, DigitalOcean hoặc Private Cloud Proxmox/VMware).
Lưu ý quan trọng: Việc quản lý State File (file lưu trữ trạng thái hạ tầng) phải được cấu hình lưu trữ tập trung tại S3 Bucket (hoặc tương đương) và sử dụng DynamoDB để khóa trạng thái (State Locking), tránh việc hai pipeline chạy đồng thời làm ghi đè và hỏng dữ liệu hạ tầng.
Cấu trúc Thư mục Dự án chuẩn DRY với Terragrunt
Điểm mấu chốt để quản lý hàng trăm VPS clone hiệu quả là cấu trúc thư mục. Terragrunt cho phép chúng ta tách biệt hoàn toàn giữa Mã nguồn Hạ tầng (Modules) và Dữ liệu Môi trường (Environments).
Dưới đây là cấu trúc thư mục mẫu tối ưu mà các doanh nghiệp lớn thường áp dụng:
├── infrastructure-modules/
│ └── vps-cluster/
│ ├── main.tf
│ ├── variables.tf
│ └── outputs.tf
└── infrastructure-live/
├── terragrunt.hcl (Root configuration - cấu hình S3 Backend chung)
├── _envcommon/
│ └── vps-app.hcl (Cấu hình base chung cho các cụm VPS)
└── production/
├── env.hcl (Biến môi trường: region, env_name)
├── vps-cluster-zone-a/
│ └── terragrunt.hcl (Khai báo số lượng 50 VPS)
└── vps-cluster-zone-b/
└── terragrunt.hcl (Khai báo số lượng 50 VPS)Trong cấu trúc này, file main.tf bên trong thư mục infrastructure-modules/vps-cluster/ chỉ cần viết một lần duy nhất, sử dụng vòng lặp (count hoặc for_each) của OpenTofu để định nghĩa tài nguyên VPS. File terragrunt.hcl tại các thư mục live (zone-a, zone-b) chỉ làm nhiệm vụ truyền tham số (input variables) như số lượng instance cần tạo (ví dụ: count = 50), giúp giảm thiểu tối đa việc copy-paste code.
Từng bước Cấu hình và Hiện thực hóa Kịch bản Triển khai
Bước 1: Khởi tạo OpenTofu Module cho VPS Clone
Đầu tiên, chúng ta xây dựng module OpenTofu cơ bản để clone VPS từ một template có sẵn (ví dụ trên môi trường ảo hóa Proxmox hoặc Cloud). Đoạn mã dưới đây minh họa cách định nghĩa tài nguyên sử dụng tính năng lặp:
File: infrastructure-modules/vps-cluster/main.tf
resource "cloud_vps_instance" "clone" {
count = var.vps_count
name = "${var.env_name}-vps-clone-${count.index + 1}"
template_id = var.template_image_id
cpu = var.cpu_cores
memory = var.memory_size_mb
network {
bridge = "vmbr0"
vlan = var.vlan_id
}
}Bước 2: Viết cấu hình Root cho Terragrunt để quản lý Remote State
Terragrunt giúp loại bỏ việc khai báo backend thủ công trong từng thư mục. Tại file root terragrunt.hcl, chúng ta định nghĩa cách tự động tạo S3 bucket và DynamoDB table để lưu trữ state file.
File: infrastructure-live/terragrunt.hcl
remote_state {
backend = "s3"
config = {
bucket = "my-company-opentofu-states"
key = "${path_relative_to_include()}/terraform.tfstate"
region = "ap-southeast-1"
encrypt = true
dynamodb_table = "opentofu-lock-table"
}
}Bước 3: Khai báo triển khai cụ thể tại thư mục Live
Tại điểm cuối của cấu trúc thư mục, chúng ta chỉ cần kế thừa cấu hình root và truyền vào các thông số đặc trưng cho cụm VPS đó.
File: infrastructure-live/production/vps-cluster-zone-a/terragrunt.hcl
include "root" {
path = find_in_parent_folders()
}
terraform {
source = "../../../infrastructure-modules//vps-cluster"
}
inputs = {
env_name = "prod"
vps_count = 50
template_image_id = "ubuntu-22.04-golden-image"
cpu_cores = 4
memory_size_mb = 8192
vlan_id = 101
}Tích hợp CI/CD Pipeline theo Chuẩn GitOps
Để hoàn thiện mô hình GitOps, toàn bộ thao tác thực thi lệnh không được diễn ra ở máy cá nhân của kỹ sư (Local machine), mà phải thông qua một hệ thống CI/CD tập trung bảo mật.
- Bước Kiểm tra (Linting & Plan): Khi có PR, Pipeline kích hoạt lệnh
terragrunt run-all plan. Lệnh này sẽ quét toàn bộ các thư mục phụ thuộc, tính toán sự thay đổi và xuất ra báo cáo trực quan ngay trên giao diện thảo luận của PR. Thành viên trong đội ngũ sẽ review cấu hình này để đảm bảo không có sai sót về mặt chi phí hoặc kiến trúc bảo mật. - Bước Triển khai (Apply): Sau khi PR được merge, nhánh
mainđược cập nhật. CD Pipeline sẽ chạy lệnhterragrunt run-all apply --terragrunt-non-interactive. Lúc này, OpenTofu sẽ đồng loạt gửi hàng trăm request API đến hạ tầng Cloud để thực hiện việc nhân bản (clone) 100 VPS một cách song song và chính xác tuyệt đối.
Kinh nghiệm Thực tế khi Vận hành Quy mô Lớn (100+ VPS)
Khi triển khai hạ tầng với số lượng tài nguyên lớn, các kỹ sư DevOps thường đối mặt với một số thách thức đặc thù. Dưới đây là các giải pháp cốt lõi được đúc kết từ thực tế:
| Thách thức | Giải pháp kỹ thuật khuyến nghị |
|---|---|
| API Rate Limiting (Bị Cloud Provider chặn do gửi quá nhiều request cùng lúc) | Sử dụng cờ --terragrunt-parallelism để giới hạn số lượng module xử lý đồng thời, hoặc cấu hình hằng số delay trong OpenTofu provider. |
| Cấu hình mạng (IP Allocation) bị trùng lặp | Tích hợp IPAM (IP Address Management) tự động qua API để cấp phát IP động, thay vì gán cứng (hardcode) IP trong file cấu hình. |
| Thời gian khởi tạo lâu | Xây dựng sẵn Golden Image (Bản image hệ điều hành đã được cài sẵn các cấu hình cơ bản, bảo mật, và agent giám sát) thay vì dùng image trắng rồi cài đặt bằng user-data/cloud-init từ đầu. |
Lời kết
Xây dựng hệ thống tự động hóa hạ tầng với OpenTofu và Terragrunt không chỉ giải quyết bài toán nhân bản 100 VPS trong vài phút, mà quan trọng hơn, nó thiết lập một nền tảng quản trị hạ tầng bền vững, chuẩn hóa theo tư duy GitOps. Doanh nghiệp của bạn sẽ đạt được tính nhất quán tối đa, giảm thiểu sai sót do yếu tố con người, và dễ dàng auditing (kiểm toán) mọi thay đổi hệ thống thông qua lịch sử Git commit. Hãy bắt đầu dịch chuyển sang OpenTofu ngay hôm nay để làm chủ tương lai của tự động hóa hạ tầng!
