> For the complete documentation index, see [llms.txt](https://docs.verge.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.verge.io/learn-the-platform/vi/module-8-nha-phat-trien-and-devops/04-terraform-packer.md).

# Terraform & Packer

Hạ tầng như mã (IaC) mang cùng khả năng kiểm soát phiên bản, rà soát đồng cấp và tính lặp lại mà các nhóm phần mềm dựa vào để cung cấp hạ tầng. Phần **nhà cung cấp Terraform VergeOS** cho phép bạn khai báo VM, mạng và người dùng trong các tệp cấu hình HCL, trong khi **plugin Packer** tự động hóa việc tạo golden image. Kết hợp lại, chúng tạo thành một quy trình khai báo: Packer tạo image, Terraform triển khai hạ tầng.

## Nhà cung cấp Terraform

Nhà cung cấp Terraform VergeOS được đăng trên Terraform Registry và hoàn toàn tương thích với **OpenTofu** (bản fork Terraform mã nguồn mở). Nó cho phép bạn quản lý tài nguyên VergeOS thông qua các quy trình chuẩn `terraform plan` / `terraform apply` quy trình làm việc.

### Cấu hình nhà cung cấp

```hcl
terraform {
  required_providers {
    vergeio = {
      source  = "verge-io/vergeio"
      version = "~> 0.1.0"
    }
  }
}

provider "vergeio" {
  host     = "https://vergeos.example.com"
  username = "admin"
  password = var.vergeos_password
  insecure = true  # Đặt thành true cho chứng chỉ SSL tự ký
}
```

| Tham số      | Bắt buộc | Mô tả                                                          |
| ------------ | -------- | -------------------------------------------------------------- |
| **host**     | Có       | URL hoặc địa chỉ IP của hệ thống hoặc tenant VergeOS           |
| **username** | Có       | Tên người dùng VergeOS với quyền phù hợp                       |
| **password** | Có       | Mật khẩu cho người dùng được chỉ định (đánh dấu là `nhạy cảm`) |
| **insecure** | Không    | Đặt `true` để chấp nhận chứng chỉ SSL tự ký                    |

{% hint style="success" %}
**Tương thích với OpenTofu**

Cấu hình nhà cung cấp giống hệt cho OpenTofu. Chỉ cần thay thế `terraform` bằng các lệnh `tofu` — không cần thay đổi mã.
{% endhint %}

### Tài nguyên

Nhà cung cấp hiện tại hỗ trợ bốn loại tài nguyên được quản lý để tạo và cập nhật các đối tượng VergeOS:

| Tài nguyên            | Mục đích                | Thuộc tính chính                                                                                                                                                                              |
| --------------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`vergeio_vm`**      | Tạo và quản lý máy ảo   | `cpu_cores`, `ram`, `os_family`, `machine_type`, `ha_group`, `cụm`, `guest_agent`, `uefi`, `secure_boot`, `snapshot_profile`, `powerstate`, nội tuyến `vergeio_drive` và `vergeio_nic` blocks |
| **`vergeio_network`** | Cấu hình mạng ảo        | `network_address` (CIDR), `dhcp_enabled`, `dhcp_start`, `dhcp_end`, `dns_server_list`, `gateway`, `powerstate`                                                                                |
| **`vergeio_user`**    | Cấp phát người dùng     | Quản lý tài khoản người dùng trong VergeOS                                                                                                                                                    |
| **`vergeio_member`**  | Quản lý thành viên nhóm | Gán người dùng vào các nhóm cho RBAC                                                                                                                                                          |

### Nguồn dữ liệu

Tám nguồn dữ liệu chỉ đọc cho phép bạn truy vấn các đối tượng VergeOS hiện có để dùng trong cấu hình của mình:

| Nguồn dữ liệu                | Trả về                                            |
| ---------------------------- | ------------------------------------------------- |
| **`vergeio_version`**        | Thông tin phiên bản VergeOS hiện tại              |
| **`vergeio_clusters`**       | Các cụm tính toán/lưu trữ khả dụng                |
| **`vergeio_nodes`**          | Các node trong môi trường                         |
| **`vergeio_networks`**       | Các mạng ảo hiện có                               |
| **`vergeio_vms`**            | Máy ảo (có thể lọc theo tên, trạng thái snapshot) |
| **`vergeio_groups`**         | Nhóm người dùng cho RBAC                          |
| **`vergeio_mediasources`**   | Các file ISO và media đã tải lên                  |
| **`vergeio_cloudinitfiles`** | Các tệp cấu hình cloud-init khả dụng              |

### Ví dụ HCL

#### VM với ổ đĩa và NIC

Ví dụ này tạo một máy chủ web Linux với một ổ đĩa virtio-scsi 10 GB và một NIC được gắn vào mạng nội bộ:

```hcl
resource "vergeio_vm" "web_server" {
  name                 = "my-web-server"
  description          = "Máy chủ web"
  enabled              = true
  os_family            = "linux"
  cpu_cores            = 2
  machine_type         = "q35"
  ram                  = 2048
  powerstate           = false
  guest_agent          = true
  cloudinit_datasource = "nocloud"
  ha_group             = "web"

  # Lưu trữ
  vergeio_drive {
    name           = "Ổ đĩa HĐH của máy chủ web"
    description    = "Ổ đĩa hệ điều hành"
    disksize       = 10
    interface      = "virtio-scsi"
    preferred_tier = 3
    orderid        = 0
  }

  # Mạng
  vergeio_nic {
    name        = "Mạng của máy chủ web"
    description = "NIC cho máy chủ web"
    interface   = "virtio"
    enabled     = true
    vnet        = vergeio_network.web_network.id
  }
}
```

#### Mạng nội bộ với DHCP

```hcl
resource "vergeio_network" "web_network" {
  name            = "web-internal-network"
  network_address = "192.168.10.0/24"
  dns_server_list = ["8.8.8.8", "8.8.4.4"]
  dhcp_enabled    = true
  dhcp_start      = "192.168.10.100"
  dhcp_end        = "192.168.10.200"
}
```

#### Truy vấn các VM hiện có

Sử dụng nguồn dữ liệu để tham chiếu hạ tầng hiện có mà không quản lý nó:

```hcl
data "vergeio_vms" "production" {
  filter_name = "prod-db"
  is_snapshot  = false
}

output "production_vms" {
  value = data.vergeio_vms.production.vms
}
```

#### Tích hợp Cloud-Init

Tính năng `vergeio_vm` Tài nguyên hỗ trợ cloud-init cho tự động hóa lần khởi động đầu tiên. Lược đồ nhà cung cấp cung cấp một `cloudinit_datasource` thuộc tính trên VM và một `vergeio_cloudinitfiles` nguồn dữ liệu để tham chiếu các tệp cloud-init đã tồn tại trong VergeOS:

```hcl
resource "vergeio_vm" "app_server" {
  name                 = "app-server-01"
  os_family            = "linux"
  cpu_cores            = 4
  machine_type         = "q35"
  ram                  = 8192
  guest_agent          = true
  cloudinit_datasource = "nocloud"

  vergeio_drive {
    name           = "Ổ đĩa HĐH"
    disksize       = 20
    interface      = "virtio-scsi"
    preferred_tier = 2
  }

  vergeio_nic {
    interface = "virtio"
    vnet      = vergeio_network.web_network.id
  }
}
```

Để biết cú pháp chính xác dùng để đính kèm tệp cloud-init nội tuyến trên tài nguyên VM (thay vì tham chiếu các tệp đã tải lên trước qua nguồn dữ liệu), hãy xem [kho mã của nhà cung cấp](https://github.com/verge-io/terraform-provider-vergeio) — dạng ở cấp trường có thể thay đổi giữa các bản phát hành.

### Độ trưởng thành & lộ trình

{% hint style="warning" %}
**Kiểm tra phạm vi tài nguyên hiện tại**

Nhà cung cấp Terraform VergeOS hiện đang được phát triển tích cực, và không phải mọi đối tượng VergeOS đều đã được hiển thị dưới dạng tài nguyên được quản lý. Các ví dụ về những khu vực có thể chưa được hỗ trợ đầy đủ vào một thời điểm nhất định bao gồm cấp phát tenant, quản lý snapshot profile và cấu hình mạng ngoài/WAN.

Luôn kiểm tra [kho GitHub](https://github.com/verge-io/terraform-provider-vergeio) và danh sách Terraform Registry về phạm vi tài nguyên hiện tại cùng ghi chú phát hành trước khi thiết kế cấu hình dựa trên chúng.
{% endhint %}

## Plugin Packer

Tính năng **Plugin Packer cho VergeOS** (`github.com/verge-io/packer-plugin-vergeio`) tự động hóa việc tạo image VM trực tiếp trên nền tảng VergeOS. Trong khi Terraform quản lý hạ tầng đang chạy, Packer tập trung vào việc xây dựng các **golden image** làm nền tảng cho các triển khai.

### Tại sao dùng Packer?

```mermaid
flowchart LR
    A["ISO cơ sở"] --> B["Bản dựng Packer"]
    B --> C["Cài đặt gói<br/>Gia cố HĐH<br/>Cấu hình dịch vụ"]
    C --> D["Image chuẩn"]
    D --> E["Công thức VM"]
    D --> F["Triển khai bằng Terraform"]
    D --> G["Cấp phát thủ công"]

    style B fill:#4a9eff,color:#fff
    style D fill:#2ecc71,color:#fff
```

Golden image đảm bảo mọi VM được triển khai đều bắt đầu từ một nền tảng đã biết, đã kiểm thử và đã được gia cố. Thay vì cấp phát một HĐH trống rồi chạy các script cấu hình trên mỗi lần triển khai, Packer chỉ cần tạo sẵn image một lần:

* **Tính nhất quán** — Mọi VM được tạo từ image đều giống hệt nhau
* **Tốc độ** — Không có độ trễ cấp phát ở lần khởi động đầu tiên; VM sẵn sàng ngay lập tức
* **Tuân thủ** — Các đường cơ sở bảo mật và bản vá được tích hợp sẵn ngay khi xây dựng
* **Tích hợp đường ống** — Kích hoạt xây dựng lại image từ CI/CD vào các ngày vá HĐH

### Cấu hình plugin

Plugin Packer được khai báo trong một `required_plugins` khối cùng với một `source` và `build` cho image đích. Tên trường chính xác cho khối `source "vergeio"` (endpoint, thông tin xác thực, kích thước VM, tùy chọn đĩa, v.v.) nên được lấy từ kho plugin, vì chúng có thể thay đổi giữa các bản phát hành:

* [`verge-io/packer-plugin-vergeio` trên GitHub](https://github.com/verge-io/packer-plugin-vergeio)

Một khai báo `required_plugins` điển hình sẽ như sau:

```hcl
packer {
  required_plugins {
    vergeio = {
      source  = "github.com/verge-io/vergeio"
      version = ">= 0.1.1"
    }
  }
}
```

### Khả năng

Ở mức độ tổng quan, plugin điều khiển toàn bộ vòng đời xây dựng Packer qua API VergeOS — tạo một VM tạm thời, chạy các provisioner và lưu lại image kết quả. Để biết lược đồ cấu hình chính xác, các kiểu guest được hỗ trợ và hành vi tắt/dọn dẹp, hãy tham khảo trực tiếp kho plugin:

* [`verge-io/packer-plugin-vergeio` trên GitHub](https://github.com/verge-io/packer-plugin-vergeio)

### Đường ống Packer → Recipe

Các image Packer tích hợp tự nhiên với hệ thống VergeOS **Recipe** Recipe của VergeOS. Quy trình điển hình:

1. **Packer** xây dựng và gia cố golden image theo lịch (ví dụ: chu kỳ vá hàng tháng)
2. Image được đăng ký như một **Recipe VM** trong VergeOS Marketplace
3. Người dùng triển khai các VM chuẩn hóa từ recipe — thông qua giao diện người dùng hoặc qua Terraform
4. Cập nhật diễn ra tự động: xây dựng lại image Packer, cập nhật recipe, và tất cả các triển khai mới sẽ nhận phiên bản mới nhất

## Mẫu quy trình IaC

### Quy trình chỉ dùng Terraform

Dành cho các nhóm muốn hạ tầng khai báo mà không có pipeline tạo image:

```mermaid
flowchart LR
    A["Cấu hình HCL"] --> B["terraform plan"]
    B --> C["terraform apply"]
    C --> D["API VergeOS"]
    D --> E["VM + mạng<br/>được tạo"]

    style B fill:#7b42f5,color:#fff
    style C fill:#4a9eff,color:#fff
```

### Pipeline đầy đủ (Packer + Terraform)

Dành cho môi trường sản xuất với quản lý golden image:

```mermaid
flowchart LR
    A["ISO cơ sở"] --> B["Bản dựng Packer"]
    B --> C["Image chuẩn"]
    C --> D["Triển khai bằng Terraform"]
    D --> E["VM sản xuất"]
    F["Kích hoạt CI/CD"] -.-> B

    style B fill:#2ecc71,color:#fff
    style D fill:#4a9eff,color:#fff
```

### Kết hợp với các công cụ khác

Terraform xử lý việc cấp phát; các công cụ quản lý cấu hình xử lý phần còn lại:

| Giai đoạn     | Công cụ                       | Mục đích                             |
| ------------- | ----------------------------- | ------------------------------------ |
| **Tạo image** | Packer                        | Xây dựng golden image đã được gia cố |
| **Cấp phát**  | Terraform                     | Triển khai VM, mạng, người dùng      |
| **Cấu hình**  | Ansible / cloud-init          | Cấu hình phần mềm sau triển khai     |
| **Giám sát**  | Prometheus / cảnh báo VergeOS | Theo dõi hạ tầng đã triển khai       |

{% hint style="info" %}
**Cầu nối VMware**

Trên VMware, nhà cung cấp vSphere của Terraform quản lý ESXi/vCenter/vSAN như các mối quan tâm riêng biệt và Packer sử dụng `vsphere-iso` trình dựng qua vCenter. Nhà cung cấp `vergeio` VergeOS duy nhất xử lý VM, mạng, ổ đĩa và người dùng thông qua một endpoint API, và plugin Packer nhắm tới cùng API đó.
{% endhint %}

{% hint style="info" %}
**Cầu nối Nutanix**

Nhà cung cấp Terraform của Nutanix (`nutanix/nutanix`) và plugin Packer đều nhắm tới API v3 của Prism Central. Nhà cung cấp VergeOS giao tiếp với một endpoint duy nhất (URL hệ thống hoặc tenant VergeOS) mà không có instance quản lý riêng, và hiển thị cấu hình cloud-init trực tiếp trên `vergeio_vm` tài nguyên thông qua `cloudinit_datasource` thuộc tính và `vergeio_cloudinitfiles` nguồn dữ liệu.
{% endhint %}

## Thực hành tốt nhất

### Quản lý trạng thái

* **Sử dụng backend trạng thái từ xa** (S3, Consul, Terraform Cloud) để cộng tác nhóm
* **Không bao giờ commit** `terraform.tfstate` vào hệ thống kiểm soát phiên bản — nó có thể chứa thông tin xác thực
* **Khóa các tệp trạng thái** để ngăn sửa đổi đồng thời trong môi trường nhiều người dùng

### Bảo mật

* **Sử dụng biến** cho các giá trị nhạy cảm (`var.vergeos_password`) — không bao giờ mã hóa cứng thông tin xác thực
* **Đánh dấu output nhạy cảm** với `sensitive = true` để tránh vô tình lộ trong log
* **Hạn chế quyền của nhà cung cấp** — tạo một người dùng API VergeOS riêng với mức truy cập tối thiểu cần thiết

### Tổ chức module

* **Tách các môi trường** thành các workspace hoặc thư mục (`dev/`, `staging/`, `prod/`)
* **Tạo các module có thể tái sử dụng** cho các mẫu thường dùng (ví dụ: một module "web-server" với VM + mạng + quy tắc tường lửa)
* **Cố định phiên bản nhà cung cấp** để tránh các thay đổi gây lỗi bất ngờ khi nâng cấp

## Đọc thêm

* [Nhà cung cấp Terraform — GitHub](https://github.com/verge-io/terraform-provider-vergeio)
* [Terraform Registry — Nhà cung cấp VergeIO](https://registry.terraform.io/providers/verge-io/vergeio/latest)
* [Plugin Packer — GitHub](https://github.com/verge-io/packer-plugin-vergeio)
* [OpenTofu Registry — Nhà cung cấp VergeIO](https://search.opentofu.org/provider/verge-io/vergeio/latest)
* [Tài liệu VergeOS — Nhà cung cấp Terraform](https://docs.verge.io/product-guide/tools-integrations/terraform-provider/)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.verge.io/learn-the-platform/vi/module-8-nha-phat-trien-and-devops/04-terraform-packer.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
