Kịch bản kinh điển: “Máy mình chạy ngon, sao lên server lại lỗi?”
Chắc hẳn anh em dev nào cũng từng ít nhất một lần ăn quả đắng: code chạy mượt mà ở local nhưng vừa đẩy lên staging là “sập tiệm”. Thủ phạm thường là sự lệch pha về phiên bản PHP, thiếu thư viện hệ thống hoặc cấu hình Nginx khác nhau. Thay vì hì hục cài cắm thủ công từng package mất cả buổi sáng, mình chọn cách tự động hóa toàn bộ quy trình này.
Hiện tại, mình đang vận hành một homelab Proxmox với khoảng 12 VM. Đây là nơi mình test mọi thứ trước khi đẩy lên production. Để đảm bảo cả team 5 người luôn dùng chung một môi trường chuẩn, mình sử dụng bộ đôi Vagrant và Ansible. Vagrant đóng vai trò dựng khung xương (máy ảo, IP, RAM), còn Ansible sẽ lo phần “đắp thịt” (cài phần mềm, cấu hình service).
Tại sao không dùng Shell Script mà phải cần Ansible?
Nhiều bạn sẽ tự hỏi: “Vagrant có sẵn shell provisioner rồi, cần gì học thêm Ansible cho mệt?”. Câu trả lời nằm ở tính Idempotency (tính lũy đẳng). Nếu bạn chạy một shell script cài Nginx hai lần, nó có thể báo lỗi hoặc ghi đè file cấu hình lung tung. Với Ansible, bạn có thể chạy một playbook 100 lần; nếu máy đã đúng cấu hình, nó sẽ không làm gì cả. Điều này cực kỳ an toàn cho hệ thống.
- Vagrant: Quản lý tầng hạ tầng (Infrastructure). Nó điều khiển VirtualBox hoặc KVM để tạo máy ảo nhanh chóng.
- Ansible: Quản lý cấu hình (Configuration Management). Nó dùng SSH để nhảy vào máy ảo và thực thi lệnh theo kịch bản có sẵn.
Đồ nghề cần thiết
Để bắt đầu, anh em hãy tải sẵn các công cụ này về máy host:
- VirtualBox: Trình giả lập máy ảo phổ biến và miễn phí.
- Vagrant: Công cụ điều phối vòng đời máy ảo.
- Ansible: Cài trên macOS/Linux để điều khiển VM. Nếu dùng Windows, bạn đừng lo, chúng ta sẽ dùng chế độ
ansible_local.
Xây dựng Web Server tự động trong 5 phút
Chúng ta sẽ tạo một máy ảo Ubuntu 22.04, tự cài Nginx và tạo một trang index tùy chỉnh. Mọi thứ chỉ gói gọn trong hai file cấu hình.
Bước 1: Tạo thư mục dự án
mkdir vagrant-ansible-demo && cd vagrant-ansible-demo
touch Vagrantfile playbook.yml
Bước 2: Cấu hình Vagrantfile
File này định nghĩa thông số máy ảo. Lưu ý phần config.vm.provision, đây là nơi Vagrant bàn giao quyền điều khiển cho Ansible.
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/jammy64"
config.vm.network "private_network", ip: "192.168.56.10"
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
vb.cpus = 1
end
config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook.yml"
end
end
Bước 3: Viết kịch bản Ansible (Playbook)
File playbook.yml sử dụng định dạng YAML cực kỳ dễ đọc. Bạn chỉ cần liệt kê những gì mình muốn, Ansible sẽ tự lo phần thực thi.
---
- name: Setup Web Server
hosts: all
become: true
tasks:
- name: Update apt cache
apt: { update_cache: yes, cache_valid_time: 3600 }
- name: Install Nginx
apt: { name: nginx, state: present }
- name: Custom Index Page
copy:
content: "<h1>Deploy thành công từ itfromzero.com!</h1>"
dest: /var/www/html/index.html
- name: Start Nginx
service: { name: nginx, state: started, enabled: yes }
Thực thi và kiểm tra kết quả
Bây giờ là lúc tận hưởng thành quả. Mở terminal và gõ:
vagrant up
Vagrant sẽ tự tải Image, tạo máy ảo và gọi Ansible. Bạn sẽ thấy các dòng log chạy liên tục. Nếu dòng chữ hiện màu xanh lá hoặc vàng, nghĩa là mọi thứ ổn áp. Chỉ mất khoảng 2-3 phút để hoàn tất toàn bộ server. Truy cập http://192.168.56.10, nếu thấy dòng chữ chào mừng thì chúc mừng bạn đã thành công!
Mẹo nhỏ khi gặp lỗi (Debug)
Làm việc với máy ảo đôi khi sẽ phát sinh lỗi vặt. Dưới đây là vài kinh nghiệm mình đúc kết được:
- Lỗi kết nối SSH: Nếu Ansible không vào được máy ảo, hãy chạy
vagrant ssh-configđể xem port và key. Đôi khi chỉ cầnvagrant reloadlà xong. - Dùng Windows? Hãy đổi sang
config.vm.provision "ansible_local". Khi đó Vagrant sẽ cài Ansible vào chính máy ảo rồi tự chạy kịch bản bên trong đó. - Check cú pháp: File YAML rất nhạy cảm với khoảng trắng. Hãy dùng lệnh
ansible-playbook --syntax-check playbook.ymlđể soi lỗi trước khi chạy.
Lời kết
Kết hợp Vagrant và Ansible giúp quy trình làm việc của bạn chuyên nghiệp hơn hẳn. Khi có thành viên mới, họ chỉ cần git clone và vagrant up là có ngay môi trường y hệt bạn. Đây chính là bước đệm vững chắc để bạn tiến sâu hơn vào thế giới DevOps và Infrastructure as Code (IaC).

