Quay lại danh sách
Tin tức công nghệ

Tự động hóa khởi tạo VPS hàng loạt trên Hetzner và DigitalOcean bằng OpenTofu và GitHub Actions

4 tháng 6, 2026

Giới thiệu về Xu hướng Tự động hóa Hạ tầng (IaC) Toàn diện

Trong kỷ nguyên chuyển đổi số và tối ưu hóa chi phí vận hành, việc quản lý hạ tầng thủ công qua giao diện web (ClickOps) không còn đáp ứng được tốc độ phát triển của doanh nghiệp. Khi nhu cầu mở rộng hệ thống tăng cao, việc khởi tạo thủ công hàng chục, hàng trăm máy chủ ảo (VPS) trên các nhà cung cấp như Hetzner hay DigitalOcean sẽ dẫn đến nguy cơ sai sót cấu hình, mất cấu trúc đồng bộ và tốn kém thời gian của đội ngũ kỹ sư vận hành (DevOps).

Để giải quyết bài toán này, mô hình Infrastructure as Code (IaC) ra đời như một tiêu chuẩn bắt buộc. Bài viết này sẽ hướng dẫn bạn cách xây dựng một pipeline tự động hóa hoàn chỉnh: Sử dụng OpenTofu — công cụ quản lý hạ tầng mã nguồn mở, kế thừa hoàn hảo từ Terraform — kết hợp với GitHub Actions để hiện thực hóa quy trình GitOps, tự động triển khai hạ tầng đa đám mây (Multi-cloud) chỉ qua một vài thao tác đẩy mã nguồn (Git Push).

Tại sao chọn OpenTofu, Hetzner và DigitalOcean?

Việc kết hợp các công cụ này mang lại sự cân bằng hoàn hảo giữa chi phí, hiệu năng và tính linh hoạt:

  • OpenTofu: Kể từ khi Terraform thay đổi giấy phép sang BSL, OpenTofu xuất hiện dưới sự bảo trợ của Linux Foundation như một giải pháp thay thế hoàn toàn miễn phí, mã nguồn mở 100%, giữ nguyên cú pháp HCL và tương thích hoàn toàn với hệ sinh thái Terraform cũ.
  • Hetzner Cloud: Nổi tiếng tại thị trường châu Âu với hiệu năng phần cứng vượt trội (CPU mạnh mẽ) đi kèm mức giá cạnh tranh nhất thị trường.
  • DigitalOcean: Cung cấp hệ sinh thái dịch vụ đa dạng, giao diện API cực kỳ ổn định, tài liệu phong phú và có các trung tâm dữ liệu phủ khắp toàn cầu (Singapore, Mỹ, Châu Âu).

Chuẩn bị Môi trường và Khởi tạo Dự án OpenTofu

Trước khi bắt đầu viết mã nguồn, bạn cần chuẩn bị các thông tin định danh (Credentials) từ các nhà cung cấp dịch vụ và lưu trữ chúng an toàn.

Bước 1: Lấy Token API từ các nhà cung cấp

  1. Truy cập bảng điều khiển Hetzner Cloud, tạo một dự án mới và sinh một API Token với quyền Đọc/Ghi (Read/Write).
  2. Truy cập tài khoản DigitalOcean, vào mục API -> Personal Access Tokens và tạo một mã Token mới tương tự.
  3. Chuẩn bị sẵn một cặp khóa SSH (SSH Key) công khai để nhúng vào các VPS sau khi khởi tạo, đảm bảo quyền truy cập bảo mật.

Bước 2: Cấu trúc thư mục dự án

Hãy tổ chức thư mục dự án OpenTofu theo chuẩn module để dễ dàng quản lý và mở rộng về sau:

├── .github/              # Thư mục cấu hình GitHub Actions
│   └── workflows/
│       └── deploy.yml    # Pipeline tự động hóa
├── main.tf               # Khai báo nhà cung cấp và gọi module
├── variables.tf          # Định nghĩa các biến đầu vào
├── outputs.tf            # Các giá trị đầu ra (IP, ID của VPS)
├── terraform.tfvars      # File chứa giá trị biến (Không commit lên Git)
└── providers.tf          # Cấu hình Providers cho Hetzner và DigitalOcean

Viết Mã Nguồn Khởi Tạo Hạ Tầng (Cú pháp HCL)

Dưới đây là cách cấu hình chi tiết cho các tệp tin cốt lõi của OpenTofu để tạo đồng thời VPS trên cả hai nền tảng.

Cấu hình file providers.tf

Chúng ta định nghĩa các nhà cung cấp dịch vụ bao gồm hcloud cho Hetzner và digitalocean cho DigitalOcean:

terraform {
  required_providers {
    hcloud = {
      source  = "hetznercloud/hcloud"
      version = "~> 1.45"
    }
    digitalocean = {
      source  = "digitalocean/digitalocean"
      version = "~> 2.30"
    }
  }
}

Cấu hình file main.tf để triển khai hàng loạt

Để triển khai hàng loạt, chúng ta sử dụng tính năng toán tử vòng lặp for_each hoặc biến đếm count trong OpenTofu. Ví dụ dưới đây hướng dẫn khởi tạo số lượng máy chủ dựa trên danh sách tên cấu hình sẵn:

# Tạo SSH Key trên Hetzner
resource "hcloud_ssh_key" "default" {
  name       = "devops-ssh-key"
  public_key = var.ssh_public_key
}

# Khởi tạo hàng loạt VPS Hetzner
resource "hcloud_server" "vps_hetzner" {
  count       = var.hetzner_instance_count
  name        = "hz-node-${count.index + 1}"
  image       = "ubuntu-22.04"
  server_type = "cx21"
  location    = "nbg1"
  ssh_keys    = [hcloud_ssh_key.default.id]
}

# Tạo SSH Key trên DigitalOcean
resource "digitalocean_ssh_key" "default" {
  name       = "devops-ssh-key"
  public_key = var.ssh_public_key
}

# Khởi tạo hàng loạt VPS DigitalOcean
resource "digitalocean_droplet" "vps_do" {
  count    = var.do_instance_count
  name     = "do-node-${count.index + 1}"
  region   = "sgp1"
  size     = "s-1vcpu-2gb"
  image    = "ubuntu-22-04-x64"
  ssh_keys = [digitalocean_ssh_key.default.id]
}
Lưu ý bảo mật quan trọng: Tuyệt đối không được hardcode các đoạn mã mã hóa, mật khẩu hoặc API Token trực tiếp vào các file .tf. Hãy luôn sử dụng cơ chế biến môi trường hoặc các công cụ quản lý bí mật.

Tự động hóa hoàn toàn với GitHub Actions CI/CD Pipeline

Để hiện thực hóa mô hình GitOps, mọi sự thay đổi về hạ tầng cần được kiểm duyệt và thực thi tự động thông qua GitHub Actions khi có mã nguồn mới được merge vào nhánh chính (main).

Thiết lập GitHub Secrets

Trước khi viết file cấu hình workflow, hãy truy cập kho lưu trữ GitHub (Repository) của bạn, chọn Settings -> Secrets and variables -> Actions và thêm các biến sau:

  • HCLOUD_TOKEN: API Token của Hetzner Cloud.
  • DIGITALOCEAN_TOKEN: API Token của DigitalOcean.
  • SSH_PUBLIC_KEY: Nội dung khóa SSH công khai của bạn để cấu hình vào VPS.

Xây dựng file cấu hình .github/workflows/deploy.yml

Workflow này sẽ tự động chạy lệnh tofu plan khi có một Pull Request để lập trình viên kiểm tra trước những thay đổi hạ tầng, và tự động chạy tofu apply để triển khai thực tế khi code được merge vào nhánh main.

name: "OpenTofu Automated Multi-Cloud Deployment"

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

env:
  TF_VAR_ssh_public_key: ${{ secrets.SSH_PUBLIC_KEY }}
  HCLOUD_TOKEN: ${{ secrets.HCLOUD_TOKEN }}
  DIGITALOCEAN_TOKEN: ${{ secrets.DIGITALOCEAN_TOKEN }}

jobs:
  opentofu:
    name: "OpenTofu Multi-Cloud Plan & Apply"
    runs-on: ubuntu-latest
    
    steps:
    - name: Checkout Code
      uses: actions/checkout@v4

    - name: Setup OpenTofu
      uses: opentofu/setup-opentofu@v1
      with:
        tofu_version: 1.6.0

    - name: OpenTofu Init
      run: tofu init

    - name: OpenTofu Format Check
      run: tofu fmt -check

    - name: OpenTofu Plan
      run: tofu plan -input=false
      if: github.event_name == 'pull_request'

    - name: OpenTofu Apply
      run: tofu apply -auto-approve -input=false
      if: github.ref == 'refs/heads/main' && github.event_name == 'push'

Quản lý State File An Toàn Toàn Diện

Mặc định, OpenTofu sẽ lưu trạng thái hạ tầng vào một file cục bộ gọi là terraform.tfstate. Trong môi trường doanh nghiệp hoạt động theo nhóm, việc lưu trữ cục bộ này cực kỳ nguy hiểm vì dễ gây xung đột dữ liệu và rò rỉ thông tin nhạy cảm lên Git.

Để giải quyết triệt để, bạn nên cấu hình Remote Backend. Bạn có thể sử dụng dịch vụ lưu trữ S3 tương thích (như AWS S3, Cloudflare R2, hoặc chính không gian lưu trữ Spaces của DigitalOcean) kết hợp với một cơ sở dữ liệu như DynamoDB để khóa trạng thái (State Locking), ngăn chặn việc hai người cùng áp dụng thay đổi một lúc.

Kết luận và Khuyến nghị Vận hành

Xây dựng hệ thống tự động hóa khởi tạo VPS hàng loạt bằng OpenTofu kết hợp với GitHub Actions không chỉ giúp doanh nghiệp tiết kiệm hàng giờ lao động thủ công mà còn chuẩn hóa toàn bộ quy trình quản lý hệ thống theo chuẩn phần mềm. Hạ tầng của bạn giờ đây có khả năng tự phục hồi, dễ dàng nhân bản ra các vùng địa lý khác nhau và được kiểm soát phiên bản chặt chẽ qua lịch sử Git.

Lời khuyên vận hành: Hãy luôn thiết lập hệ thống cảnh báo ngân sách (Budget Alerts) trên cả Hetzner và DigitalOcean để tránh việc mã nguồn vòng lặp vô tận tạo ra số lượng tài nguyên vượt quá kiểm soát tài chính của doanh nghiệp.