TÌM HIỂU VAGRANT (PHẦN 1)

Nếu là 1 developer, hoặc thậm chí là 1 tester hay designer, miễn là làm việc cho 1 công ty IT, chắc hẳn bạn đã trải nghiệm cảm giác vào 1 công ty nào đó và nghe câu đầu tiên: “Để tham dự vào dự án, bạn cài hết list phần mềm này nhé, bạn có 1 ngày để làm việc này”. Hoặc nếu là 1 web developer, chắc bạn sẽ quen với câu nói “Server chết hả? Máy tôi có sao đâu?”, hoặc “Sao máy anh ý chạy mà máy tôi không chạy?”.

Rõ ràng các vấn đề như trên có thể đi vào cuộc sống hàng ngày của ITer. Chúng ta có thẻ thấy, ngày nay các phần mềm tiện ích càng ngày càng nhiều, đi kèm với đó là sự phức tạp trong tổ chức hệ thống của các project cũng như khâu thiết lập môi trường để triển khai các dự án. Ảo hóa trở thành giải pháp cho việc phát triển các phần mềm. Khi mới bắt đầu biết đến VirtualBox, VMware, tôi thực sự thích thú khi các công cụ này giúp tôi phát triển trên nhiều dòng OS khác nhau. Tuy nhiên, vậy là chưa đủ. Nếu chỉ làm việc với VirtualBox hoặc VMware, bạn chỉ có thể thiết lập cho 1 máy, có nghĩa là trên máy bạn thì chỉ setup 1 lần cho 1 máy, cũng như khó để chia sẽ máy ảo đó cho người khác. Và vagrant sinh ra để giải quyết vấn đề này, nhiều máy sẽ được quản lý 1 cách đơn giản bởi chỉ 1 file text duy nhất.

Vagrant là gì

Vagrant là 1 công cụ xây dựng và quản lý các máy ảo, có thể chạy trên Ubuntu, MacOS và cả Windows. Có thể nói Vagrant đang đứng trên vai những người khổng lồ. Máy ảo được cung cấp bởi các provider là VirtualBox, VMware, AWS,… Các phần mềm được cài đặt sử dụng provisioner đã trở thành quy chuẩn là shell scripts, Chef, Puppet. Điều này giúp cho vagrant có thể quản lý nhiều loại máy ảo khác nhau, tự động cài đặt phần mềm cho máy tính mà không quan tâm đang sử dụng OS hay distribution nào.

Lợi ích của Vagrant

Với developer

Tất cả các phần mềm cũng như config khác đều được thực hiện bởi người tạo ra Vagrantfile, tất cả các thành viên sẽ có cùng 1 môi trường phát triển. Không phân biệt bạn dùng Mac, Ubuntu hay Windows, bạn sẽ có cùng môi trường phát triển với các thành viên khác và thậm chí với cả production server. Điều này giảm thiểu được thời gian cài đặt phần mềm, giảm thiểu các bug chỉ xảy ra ở 1 môi trường nhất định. Bạn cũng không gặp phải bug trên production server mà nhận được câu trả lời của developer là: “Máy tôi vẫn chạy ổn mà”!

Với operations engineer

  • Bạn có thể setup cùng lúc nhiều VM networks 1 cách đơn giản: Nếu chỉ dùng VirtualBox đơn thuần, bạn cần setup lần lượt cho từng máy trong cả hệ thống server. Còn với vagrant, bạn chỉ cần 1 file config và có thể build/edit cùng 1 lúc nhiều máy 1 cách đơn giản.

  • Quản lý source 1 cách đơn giản: Bằng việc đẩy tất cả setup vào 1 textfile và quản lý bới subversion control (git chẳng hạn), bạn sẽ dễ dàng kiểm soát các thiết lập của mình. Trong trường hợp có lỗi cũng dễ dàng check thay đổi hoặc revert về trạng thái không lỗi.

  • Đa nền tảng: Với hệ thống boxes đa dạng và phong phú, bạn dễ dàng thử với nhiều OS khác nhau cũng như distribution khác nhau. Ngoài ra, với việc sử dụng các provision tool, bạn dễ dàng cài đặt phần mềm trên nhiều dòng OS khác nhau.

Với Designer

Bạn không còn phải cố gắng thiết lập website chạy trên máy mình 1 cách khó khăn với hàng tá intruction, bạn cũng không cần phải nhìn xem design của mình có chạy ổn trên máy của developer không, điều bạn cần chỉ là cài đặt vagrant, và vagrant up sẽ làm phần còn lại cho bạn. Sau đó, bạn có thể quay lại với công việc của mình, design!

Đến đây chắc hẳn bạn đọc bắt đầu muốn tìm hiểu về Vagrant. Vậy thì hãy bắt đầu thôi!

Let’s start!

Installation

Vagrant được viết bằng Ruby, đây là 1 repository thuộc hàng top trending của Ruby trên github, bạn có thể xem soucre code ở trang https://github.com/mitchellh/vagrant. Bạn không cần cài Ruby sẵn trong máy, có thể download bản cài trực tiếp của Vagrant tại trang chủ. http://www.vagrantup.com/downloads. Cài đặt rất đơn giản, tuy nhiên để sử dụng và nhất là master vagrant, bạn cần có kiến thức về Ruby.

Project Setup

Cài đặt xong vagrant, bạn có thể chạy đơn giản từ terminal bằng cách gõ vagrant. Để khởi tạo 1 project bạn có thể làm như sau:

mkdir vagrant_sample
cd vagrant_sample
vagrant init

Sau bước này, 1 file tên là Vagrantfile sẽ được tạo ra trong thư mục vagrant_sample. File này có 2 việc: 1 là chỉ định root directory cho project của bạn, các setup sau này sẽ được tính toán relative path từ Vagrantfile. 2 là setting cho toàn project, bao gồm OS, distribution, resources và các phần mềm được cài đặt cũng như cách access vào machine. Đây là 1 file được viết bằng Ruby (mặc dù không có đuôi .rb).

Boxes

Nếu như để cài đặt 1 OS bình thường, bạn mất đến nửa giờ đồng hồ chỉ để click chuột và ấn enter, thì với Vagrant boxes, bạn sẽ tiết kiệm được rất nhiều thời gian. Vagrant box là base image giúp bạn dễ dàng tạo 1 máy ảo. Sau đây là lệnh clone box về host machine.

vagrant box add hashicorp/precise32

Vagrant sẽ tự động tìm box với tên hashicorp/precise32 từ HashiCorp’s Atlas box catalog và download box này về máy tính của bạn. Đây là box có thể tái sử dụng trong nhiều project. Mỗi khi 1 project mới được tạo từ box này, vagrant sẽ tự động copy ra 1 image khác, mọi chỉnh sửa sẽ không ảnh hưởng đến base box. Để set box cho project của bạn, bạn cần edit file Vagrantfile như sau.

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise32"
end

Box được tạo bởi user hashicorp và tên box là precise32. Cài đặt xong box này, bạn sẽ có trong máy tính của mình 1 máy ảo Ubuntu 14.04 LTS 32 bit. Bạn cũng có thể tự đăng ký tài khoản và tạo + share box của mình cho những người dùng khác trên trang https://atlas.hashicorp.com. Chi tiết về quản lý box sẻ được đề cập đến ở các bài viết tiếp theo.

Up and SSH

Sau khi đã hoàn tất các setup cơ bản, bạn có thể bật máy và login vào máy như sau.

vagrant up
vagrant ssh

Với lần đầu bật máy, bạn sẽ phải chờ đợi để vagrant clone từ base box ra, còn những lần sau thì rất nhanh chóng bạn sẽ bật được máy. Sau khi login, bạn sẽ có đầy đủ quyền để làm tất cả với máy tính của mình. Ngoại trừ việc xóa file “nhạy cảm”.

Synced folders

Mặc dù có trong tay 1 máy ảo được cài đặt rất đơn giản, không phải ai cũng muốn vào trực tiếp máy để “code”. Do vậy, mặc định vagrant hỗ trợ rất tốt cho việc đồng bộ file giữa máy chủ và máy ảo. Mặc định thư mục root của máy chủ (thư mục chứa file Vagrantfile) sẽ được đồng bộ với thư mục /vagrant trên máy ảo. Và thực sự, file Vagrant bạn nhìn thấy ở thư mục root của project đã nằm ở /vagrant/Vagrantfile trong máy ảo. File “nhạy cảm” mà tôi muốn nói là file này. Mặc dù bạn có đầy đủ quyền làm mọi việc với máy ảo, nhưng đừng xóa file config của cả hệ thống!

Để test chức năng sync, bạn có thể làm như sau

[email protected]:~$ cd /vagrant
[email protected]:/vagrant$ echo "test sync" > test_sync.txt
[email protected]:/vagrant$ exit
logout
Connection to 127.0.0.1 closed.
[email protected]:~/study/vagrant/vagrant_sample$ cat test_sync.txt
test sync

Vagrant hỗ trợ nhiều giao thức cho việc sync file trong thư mục share. Bạn có thể dùng smb, nfs, rsync. Khi provider là Virtualbox, mặc định bạn sẽ được sử dụng VirtualBox share folders. Tuy nhiên, chú ý rằng bản thân VirtualBox bị lỗi phần này liên quan đến sendfile, nên nếu muốn dùng mặc định sync type, để cho chắc chắn, bạn cần config server như sau.

Nginx

sendfile off;

Apache

EnableSendfile Off

Chi tiết về bug này có thể tham khảo ở link sau https://docs.vagrantup.com/v2/synced-folders/virtualbox.html.

Provisioning

Đến đây bạn đã có trong tay 1 máy ảo cài đặt và sử dụng rất đơn giản. Nhờ sync folder, bạn thoải mái dev trên host computer và yên tâm là máy áo sẽ được cập nhật code mới realtime. Tuy nhiên vagrant không dừng lại ở đây, 1 trong ưu điểm của vagrant đó là provisioning. Nói đơn giản thì khi bật máy lên lần đầu, vagrant sẽ thực hiện việc cài đặt các phần mềm cho máy của bạn theo những gì bạn thiết lập. Phương pháp đơn giản và cổ điển nhất là sử dụng shell script. Ví dụ, nếu bạn muốn cài đặt git ngay khi bật máy lần đầu, bạn cần edit Vagrantfile như sau.

config.vm.provision "shell", inline: <<-SHELL
    sudo apt-get install git
SHELL

Ở lần đầu up sau khi add provision, bạn sẽ thấy vagrant tự động chạy đoạn shell trên và cài git cho bạn. Trong trường hợp bạn edit provision, bạn cần up vagrant với tham số –provision.

Tương đương với cài đặt từ inline shell thì bạn có thể tạo 1 file script riêng để vagrant chạy khi khởi động. Tuy nhiên cách sử dụng shell là 1 phương pháp khá cổ điển, vì ngày này có nhiều công cụ hộ trỡ đắc lực cho việc cài đặt trên các hệ thống lớn. 2 lựa chọn nổi tiếng dành cho vagrant là ChefPuppet. Tôi sẽ giới thiệu về các công cụ này trong các bài viết tiếp theo.

Networking

Sau khi đã cài đặt đầy đủ môi trường phát triển web, việc cuối cùng chúng ta cần làm là config network để có thể access vào máy ảo và chạy website của mình. Công việc này rất đơn giản với Vagrant. Bạn chỉ cần config Vagrantfile như sau:

config.vm.network :forwarded_port, host: 4567, guest: 80

Từ đây trở đi, access đến cổng 4567 của máy chủ sẽ được chuyển đến cổng 80 của máy ảo. Ngoài config basic với port forwarding, bạn còn có thể config phức tạp hơn dựa theo tài liệu config NETWORKING của Vagrant.

Tổng kết

Bài viết trên đã cung cấp cho bạn đọc cái nhìn cơ bản về Vagrant, biết nó là gì và biết setup 1 máy ảo đơn giản. Trong các bài viết tiếp theo, chúng ta sẽ cùng tìm hiểu những feature lớn hơn của Vagrant, bao gồm Provisioning, Multi-Machine và Boxes.

Bạn đọc muốn tham khảo các setup Vagrant đơn giản được giới thiệu trong bài viết có thể xem ở repository sau. https://github.com/dinhhoanglong91/vagrant_sample Ở đây tôi đã cài thành công môi trường phát triển web cơ bản, với git, vim, apache, php, MySQL sử dụng shell provisioning.

Cảm nghĩ cá nhân về Vagrant

Rõ ràng chúng ta thấy được những điểm mạnh rất lớn của Vagrant, và nếu tiếp tục tìm hiểu thì chúng ta sẽ còn thấy được nhiều hơn. Tuy nhiên dưới góc độ của 1 developer, tôi cho rằng có 1 vấn đề khá lớn đối với Vagrant.

Thường thì trong team, leader sẽ đảm nhiệm việc config vagrant từ đầu đến cuối, điều này giúp ích rất nhiều cho members. Tuy nhiên, nếu trong team có nhiều người mới làm quen với công việc, và tiếp tục sử dụng Vagrant, họ sẽ không thể có cơ hội thực hành config server thực tế. Điều này có thể cản trở việc cải thiện khả năng của họ. Do vậy, chúng ta cần sử dụng Vagrant 1 cách linh hoạt kết hợp với nâng cao khả năng của các members trong team.

Tài liệu tham khảo