Cài đặt Terraform và các Provider cần thiết
Bước đầu tiên là thiết lập môi trường Terraform trên một VM Debian/Ubuntu trong Proxmox để quản lý hạ tầng.
Tại sao cần làm vậy? Terraform là công cụ Infrastructure as Code (IaC) chính, giúp bạn định nghĩa tài nguyên Proxmox và AWS dưới dạng code. Việc cài đặt trực tiếp trên VM Proxmox giúp giảm thiểu sự phức tạp khi quản lý từ xa.
Trước tiên, hãy cập nhật hệ thống và cài đặt các gói phụ thuộc cần thiết cho Terraform.
apt update && apt install -y unzip wget gnupg2 software-properties-common
Kết quả mong đợi: Hệ thống được cập nhật, các công cụ wget, unzip, gnupg2 đã sẵn sàng.
Tiếp theo, thêm repository chính thức của HashiCorp vào hệ thống để đảm bảo phiên bản Terraform luôn mới và ổn định.
curl -fsSL https://apt.releases.hashicorp.com/gpg | 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" | tee /etc/apt/sources.list.d/hashicorp.list
Kết quả mong đợi: File keyring được tạo và dòng source được thêm vào file sources.list.
Cài đặt Terraform và các plugin provider (Proxmox, AWS) thông qua gói apt.
apt update && apt install -y terraform
Kết quả mong đợi: Terraform được cài đặt thành công, bạn có thể chạy lệnh `terraform version` để kiểm tra.
Để quản lý provider Proxmox và AWS, chúng ta sẽ sử dụng Terraform Registry. Tuy nhiên, trong cấu hình Terraform, việc khai báo provider sẽ tự động kéo về các plugin này khi chạy lệnh `init`. Chúng ta sẽ khai báo chi tiết trong bước cấu hình sau.
Verify kết quả
Chạy lệnh kiểm tra phiên bản để xác nhận Terraform đã hoạt động.
terraform version
Kết quả mong đợi: Hiển thị phiên bản Terraform (ví dụ: Terraform v1.6.x) và thông báo về các plugin đang có (nếu đã init).
Cấu hình biến môi trường cho AWS Access Key
Bước này nhằm bảo mật thông tin xác thực AWS, tránh việc hardcode (ghi cứng) Access Key và Secret Key trong file code Terraform.
Tại sao cần làm vậy? Đây là best practice trong bảo mật. Biến môi trường giúp bạn chia sẻ code Terraform trên Git mà không lo lộ thông tin nhạy cảm. Terraform sẽ tự động đọc các biến này khi cần thiết.
Giả sử bạn đã có AWS Access Key và Secret Key từ AWS Console. Hãy thêm chúng vào file `.bashrc` hoặc `.profile` của user hiện tại.
echo 'export AWS_ACCESS_KEY_ID="YOUR_AWS_ACCESS_KEY_ID"' >> ~/.bashrc
echo 'export AWS_SECRET_ACCESS_KEY="YOUR_AWS_SECRET_ACCESS_KEY"' >> ~/.bashrc
echo 'export AWS_DEFAULT_REGION="ap-southeast-1"' >> ~/.bashrc
Kết quả mong đợi: Các biến môi trường được thêm vào file cấu hình shell.
Áp dụng thay đổi ngay lập tức bằng lệnh source.
source ~/.bashrc
Kết quả mong đợi: Không có lỗi, terminal sẵn sàng sử dụng các biến mới.
Để kiểm tra tính bảo mật, hãy tạo một file `.env` trong thư mục dự án Terraform để Terraform tự động load các biến này, thay vì khai báo trong file `main.tf`.
cat > .env
Kết quả mong đợi: File `.env` được tạo với nội dung đầy đủ.
Thêm file `.env` vào danh sách bỏ qua (`.gitignore`) để đảm bảo nó không bao giờ được push lên Git.
echo ".env" >> .gitignore
Kết quả mong đợi: File `.env` đã nằm trong `.gitignore`.
Verify kết quả
Chạy lệnh để kiểm tra biến môi trường đã được hệ thống nhận diện chưa.
echo $AWS_ACCESS_KEY_ID
Kết quả mong đợi: In ra chuỗi Access Key mà bạn đã nhập.
Viết script Terraform đầu tiên để tạo VM trên Proxmox
Bây giờ chúng ta sẽ tạo file cấu hình đầu tiên để định nghĩa một Virtual Machine (VM) trên Proxmox.
Tại sao cần làm vậy? Đây là bước quan trọng để kết nối Terraform với API của Proxmox. Script này sẽ minh họa cách khai báo provider Proxmox và tài nguyên VM cơ bản.
Tạo thư mục dự án mới và file cấu hình `main.tf`.
mkdir terraform-proxmox && cd terraform-proxmox
cat > main.tf
Kết quả mong đợi: File `main.tf` được tạo với nội dung khai báo provider Proxmox, AWS và tài nguyên VM.
Lưu ý: Bạn cần thay thế `192.168.1.100`, `YOUR_PROXMOX_PASSWORD`, và các thông số IP theo thực tế của bạn.
Thực hiện lệnh `terraform init` để tải về các provider đã khai báo.
terraform init
Kết quả mong đợi: Thông báo "Initialization complete!" và các plugin proxmox, aws được tải về thư mục `.terraform`.
Tạo file plan để xem trước những thay đổi Terraform sẽ thực hiện.
terraform plan
Kết quả mong đợi: Hiển thị dòng "+ resource "proxmox_vm_qemu" "test_vm" {...}" cho thấy Terraform chuẩn bị tạo 1 VM mới.
Thực thi lệnh apply để tạo VM thực tế.
terraform apply
Kết quả mong đợi: Terraform hỏi "Do you want to perform these actions? (yes/no)". Nhập `yes` và nhấn Enter. Sau đó VM sẽ được tạo trên Proxmox.
Verify kết quả
Đăng nhập vào giao diện web Proxmox và kiểm tra xem VM "terraform-test-vm" đã xuất hiện trong danh sách chưa.
terraform show
Kết quả mong đợi: Hiển thị trạng thái hiện tại của VM đã được tạo.
Quản lý state file của Terraform với backend local và S3
State file (`terraform.tfstate`) lưu trữ trạng thái hiện tại của hạ tầng. Mặc định Terraform lưu local, nhưng để làm việc nhóm và bảo mật, chúng ta cần lưu lên S3 (Remote Backend).
Tại sao cần làm vậy? State file local dễ bị mất, không an toàn khi chia sẻ, và gây xung đột khi nhiều người cùng làm việc. S3 backend kết hợp với DynamoDB (cho locking) là tiêu chuẩn vàng cho Terraform.
Trước tiên, chúng ta sẽ cấu hình backend S3. Tạo một file `backend.tf` riêng biệt.
cat > backend.tf
Kết quả mong đợi: File `backend.tf` được tạo, khai báo cấu hình S3.
Bước này giả định bạn đã tạo sẵn Bucket S3 và DynamoDB Table trong AWS. Nếu chưa, bạn cần tạo chúng qua AWS Console hoặc Terraform trước.
Để migrate state từ local sang S3, chạy lệnh `terraform init` với cờ `-migrate-state`.
terraform init -migrate-state
Kết quả mong đợi: Terraform hỏi xác nhận migrate state file. Nhập `yes`. Sau đó state file sẽ được upload lên S3.
Để kiểm tra state đang nằm ở đâu, sử dụng lệnh `terraform state list`.
terraform state list
Kết quả mong đợi: Danh sách các resource đã quản lý (ví dụ: `proxmox_vm_qemu.test_vm`).
Nếu bạn muốn quay lại dùng backend local (ví dụ để debug offline), bạn có thể comment lại phần backend trong `backend.tf` và chạy `terraform init -reconfigure`.
terraform init -reconfigure
Kết quả mong đợi: Terraform chuyển đổi sang sử dụng file state local.
Verify kết quả
Đăng nhập vào AWS Console, vào dịch vụ S3, tìm bucket `my-terraform-state-bucket` và kiểm tra xem file `proxmox/terraform.tfstate` có tồn tại không.
aws s3 ls s3://my-terraform-state-bucket/proxmox/
Kết quả mong đợi: Danh sách file `terraform.tfstate` được hiển thị, xác nhận state đã được lưu remote.
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng Multi-Cloud Hybrid với Terraform, Crossplane và GitOps trên hạ tầng Proxmox và AWS
« Phần 1: Khởi đầu: Yêu cầu hệ thống và chuẩn bị môi trường Proxmox và AWS
Phần 3: Triển khai hạ tầng Hybrid đầu tiên với Terraform »