Tự động hóa triển khai VPS với Terraform và Ansible trong 30 phút: Hướng dẫn chi tiết từ A-Z
Giới thiệu
Trong thời đại DevOps hiện đại, việc triển khai và quản lý hạ tầng máy chủ thủ công không chỉ tốn thời gian mà còn dễ gây ra lỗi. Việc kết hợp Terraform và Ansible mang đến giải pháp tự động hóa mạnh mẽ, giúp bạn triển khai VPS một cách nhất quán, có thể lặp lại và dễ dàng mở rộng.
Bài viết này sẽ hướng dẫn bạn từng bước để thiết lập quy trình tự động hóa hoàn chỉnh, từ việc khởi tạo VPS với Terraform đến cấu hình ứng dụng với Ansible - tất cả chỉ trong 30 phút.
Tại sao cần tự động hóa triển khai VPS?
Trước khi đi vào chi tiết kỹ thuật, hãy cùng xem xét những lợi ích thiết thực mà tự động hóa mang lại:
- Tiết kiệm thời gian: Giảm thời gian triển khai từ hàng giờ xuống còn vài phút
- Tính nhất quán: Đảm bảo mọi môi trường được cấu hình giống hệt nhau
- Giảm thiểu lỗi: Loại bỏ sai sót do thao tác thủ công
- Khả năng mở rộng: Dễ dàng nhân bản và triển khai nhiều server
- Version control: Quản lý infrastructure như code, theo dõi mọi thay đổi
- Disaster recovery: Khôi phục hệ thống nhanh chóng khi có sự cố
Terraform vs Ansible: Vai trò và sự khác biệt
Để hiểu rõ quy trình, bạn cần nắm được vai trò riêng biệt của từng công cụ:
Terraform - Provisioning Infrastructure
Terraform là công cụ Infrastructure as Code (IaC) được thiết kế để tạo, thay đổi và quản lý hạ tầng. Nó tập trung vào việc:
- Khởi tạo VPS trên các cloud provider (DigitalOcean, AWS, Azure, GCP...)
- Cấu hình network, firewall, load balancer
- Quản lý DNS records và storage volumes
- Duy trì trạng thái (state) của infrastructure
Ansible - Configuration Management
Ansible là công cụ tự động hóa cấu hình và triển khai ứng dụng. Nó chuyên về:
- Cài đặt và cấu hình phần mềm trên server
- Quản lý users, permissions và security settings
- Deploy ứng dụng và services
- Thực hiện các tác vụ bảo trì định kỳ
Kết hợp cả hai, bạn có một pipeline hoàn chỉnh: Terraform tạo server, Ansible cấu hình và triển khai ứng dụng.
Chuẩn bị môi trường làm việc
Trước khi bắt đầu, hãy đảm bảo bạn đã cài đặt các công cụ cần thiết:
Yêu cầu hệ thống
- Hệ điều hành: Linux, macOS hoặc Windows với WSL2
- Terraform phiên bản 1.0 trở lên
- Ansible phiên bản 2.9 trở lên
- Python 3.8+
- SSH client
- Tài khoản cloud provider (ví dụ: DigitalOcean, AWS)
Cài đặt Terraform
Trên Ubuntu/Debian:
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 terraform
Cài đặt Ansible
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
Bước 1: Thiết lập Terraform (10 phút)
Cấu trúc thư mục dự án
Tạo cấu trúc thư mục như sau:
infrastructure/
├── terraform/
│ ├── main.tf
│ ├── variables.tf
│ ├── outputs.tf
│ └── terraform.tfvars
└── ansible/
├── inventory/
├── playbooks/
└── roles/
Viết Terraform configuration
Trong file main.tf, định nghĩa VPS của bạn:
terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}
provider "digitalocean" {
token = var.do_token
}
resource "digitalocean_droplet" "web" {
image = "ubuntu-22-04-x64"
name = "web-server-${var.environment}"
region = var.region
size = var.droplet_size
ssh_keys = [var.ssh_fingerprint]
tags = ["web", var.environment]
}
File variables.tf để quản lý biến:
variable "do_token" {
description = "DigitalOcean API Token"
type = string
sensitive = true
}
variable "region" {
description = "Datacenter region"
default = "sgp1"
}
variable "droplet_size" {
description = "Droplet size"
default = "s-1vcpu-1gb"
}
Khởi tạo và triển khai
Chạy các lệnh sau:
terraform init- Khởi tạo working directoryterraform plan- Xem trước các thay đổiterraform apply- Triển khai infrastructure
Sau khoảng 2-3 phút, VPS của bạn sẽ được tạo và sẵn sàng.
Bước 2: Cấu hình Ansible (10 phút)
Tạo Ansible inventory động
Sử dụng Terraform output để tạo inventory tự động:
Trong outputs.tf:
output "droplet_ip" {
value = digitalocean_droplet.web.ipv4_address
}
output "droplet_id" {
value = digitalocean_droplet.web.id
}
Tạo script để generate inventory:
#!/bin/bash
DROPLET_IP=$(terraform output -raw droplet_ip)
echo "[webservers]" > ../ansible/inventory/hosts
echo "$DROPLET_IP ansible_user=root" >> ../ansible/inventory/hosts
Viết Ansible playbook
Tạo file playbooks/setup.yml:
---
- name: Configure web server
hosts: webservers
become: yes
tasks:
- name: Update apt cache
apt:
update_cache: yes
cache_valid_time: 3600
- name: Install required packages
apt:
name:
- nginx
- ufw
- certbot
state: present
- name: Configure firewall
ufw:
rule: allow
port: "{{ item }}"
loop:
- '22'
- '80'
- '443'
- name: Enable firewall
ufw:
state: enabled
- name: Start nginx
service:
name: nginx
state: started
enabled: yes
Bước 3: Tích hợp và tự động hóa (10 phút)
Tạo script tự động hóa toàn bộ quy trình
Tạo file deploy.sh để chạy toàn bộ pipeline:
#!/bin/bash
set -e
echo "=== Deploying infrastructure with Terraform ==="
cd terraform
terraform init
terraform apply -auto-approve
echo "=== Generating Ansible inventory ==="
./generate_inventory.sh
echo "=== Waiting for SSH to be ready ==="
sleep 30
echo "=== Configuring server with Ansible ==="
cd ../ansible
ansible-playbook -i inventory/hosts playbooks/setup.yml
echo "=== Deployment completed successfully ==="
terraform output
Best practices và tối ưu hóa
- Sử dụng Terraform modules: Tổ chức code thành modules tái sử dụng
- Remote state: Lưu Terraform state trên S3 hoặc Terraform Cloud
- Ansible roles: Chia nhỏ playbooks thành roles có cấu trúc
- Secrets management: Sử dụng Ansible Vault hoặc HashiCorp Vault
- CI/CD integration: Tích hợp vào GitLab CI hoặc GitHub Actions
Xử lý lỗi thường gặp
Lỗi SSH connection timeout
Nếu Ansible không thể kết nối, hãy kiểm tra:
- SSH key đã được thêm vào cloud provider
- Security group/firewall cho phép port 22
- Đợi đủ thời gian để server khởi động hoàn toàn
Lỗi Terraform state lock
Nếu gặp lỗi state lock, chạy:
terraform force-unlock [LOCK_ID]
Mở rộng và nâng cao
Sau khi đã thành thạo quy trình cơ bản, bạn có thể:
- Thêm monitoring với Prometheus và Grafana
- Triển khai multiple environments (dev, staging, production)
- Implement blue-green deployment
- Tự động scaling với auto-scaling groups
- Tích hợp container orchestration (Kubernetes, Docker Swarm)
Kết luận
Việc tự động hóa triển khai VPS với Terraform và Ansible không chỉ giúp bạn tiết kiệm thời gian mà còn nâng cao chất lượng và độ tin cậy của hệ thống. Với 30 phút đầu tư, bạn đã có một pipeline tự động hoàn chỉnh có thể tái sử dụng cho mọi dự án.
Hãy bắt đầu với một dự án nhỏ, làm quen với các công cụ, và dần dần mở rộng quy trình tự động hóa của bạn. Infrastructure as Code không chỉ là xu hướng mà đã trở thành tiêu chuẩn công nghiệp trong phát triển phần mềm hiện đại.
Chúc bạn triển khai thành công!
