Vagrant & Ansible: Cặp bài trùng giúp ‘diệt tận gốc’ lỗi môi trường khi Deploy

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

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 VagrantAnsible. 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:

  1. VirtualBox: Trình giả lập máy ảo phổ biến và miễn phí.
  2. Vagrant: Công cụ điều phối vòng đời máy ảo.
  3. 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ần vagrant reload là 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 clonevagrant 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).

Share: