Saturday, July 20, 2013

Giới thiệu Vagrant

Mở bài
Trong quá trình phát triển application thì chắc chắn developer phải đi qua 1 công đoạn gọi là "setup environment" bởi vì từng project sẽ có những yêu cầu, frameworks, tools, libraries etc.. khác nhau.

Và nếu là ở vị trí team leader, project management, technical leader thì việc tốn thời gian setup environment cho project mới và cho developer mới là 1 việc làm lập đi lập lại và khá tốn thời gian, làm giảm năng suất làm việc. Và việc để từng developer tự setup environment có thể gây ra sự không đồng bộ dẫn tới những sai sót trong quá trình phát triển

Ngoài ra, trong lúc phát triển thì 80% là sẽ phải thêm vào những libraries, tools etc.. khác vào project, và việc đồng bộ thay đổi này với cả team lại 1 lần nữa tốn thời gian của cả team.

Tiếp theo là việc deployment, việc nhớ và ghi lại cái libraries, tools đã dùng trong lúc development và cài những cái đó vào production environment thì lại 1 lần nữa tốn thời gian và có thể có sai sót

Tóm lại là quá trình setup environment và deployment nếu làm 1 cách thủ công thì rất mất thời gian và dễ sai sót

Thân bài
VAGRANT!!!!

Từ trang chủ Vagrant(http://vagrantup.com/)

Quote:
Vagrant lowers development environment setup time, maximizes dev/prod parity, and makes the "works on my machine" excuse a relic of the past.
Vagrant được viết từ Ruby và sử dụng VirtualBox (Free). Hiểu nôm na thì vagrant được dùng để setup và điều khiển 1 virtual machine (máy ảo). Nếu dùng vagrant thì tất cả developer sẽ có chung 1 môi trường làm việc thống nhất, và có thể đồng bộ hoá với nhau (thông qua 1 software version control như git). Và việc setup vagrant thì chỉ cần 1 người làm (Team Leader chẳng hạn)

Trong lúc phát triển, nếu như có những thay đổi nào về environment, developer chỉ cần thêm vào "cookbooks" (1 thuật ngữ dùng để chỉ 1 folder gồm nhiều file ruby dùng để setup environment), hoặc developer liên hệ với team leader để team leader update vagrant box và các developers khác chỉ cần chạy 1 câu lệnh để update environment

Nhược điểm duy nhất của Vagrant là ngốn nhiều CPU + RAM + HDD vì phải cài đặt 1 virtual machine.

Ưu điểm của vagrant
- Dễ backup vì chỉ cần sao lưu file máy ảo
- Không phải cài lung tung vào máy chính
- Sau vài tháng nếu muốn tiếp tục phát triển project thì chỉ cần 1 câu lệnh là đâu vào đó
- Code được chạy native trên Linux nhưng không cần phải cài Linux vào máy chính, vagrant có thể chạy được trên Mac, Linux và Windows. Developers có thể sử dụng bất kì IDE, text editor nào để phát triển
- Cookbooks của vagrant có thể dùng để deploy trực tiếp cho production server thông qua chef solo (1 ruby library khác để cài đặt environment)

================================================
Tạm thời nhiêu đây, đi ăn cái rồi mai viết tiếp 
Reply With Quote
  #2  
Old 03-08-2012, 22:18
Senior Member
 
Join Date: 06-2007
Posts: 590
Re: Vagrant

Cách cài đặt Vagrant
- Đầu tiên là phải cài VirtualBox trước
- Sau đó là cài vagrant, có 2 cách cài vagrant
  • Pre-built
    Cách này thì đơn giản, chỉ cần vào link trên và download phiên bản phù hợp và cài
  • Rubygem
    Cách này thì máy phải có sẵn ruby và rubygems, cách cài ruby và rubygems thì google cái là ra

    Sau khi cài xong ruby, rubygems thì
    Quote:
    gem install vagrant

[b]Cài đặt base box[b]
Sau khi cài xong vagrant thì việc đầu tiên cần làm là cài base box. Base box cũng giống như 1 file ISO để cài 1 máy ảo, nhưng nó được tối ưu để sử dụng với vagrant. Thường thì Base box là Ubuntu LTS (Lucid, Precise) 32bit và sử dụng 384MB, tuy nhiên cũng có những community box (http://www.vagrantbox.es/).

Base box sẽ được cài 1 lần duy nhất, từ 1 base box thì nhiều virtual machine sẽ được setup và provision (cài đặt các libraries cần thiết) tuỳ theo yêu cầu từng project.

Quote:
vagrant box add lucid32 http://files.vagrantup.com/lucid32.box
Setup project
Vào thư mục của project, chạy 2 câu lệnh sau
Quote:
vagrant init lucid32
vagrant up
Dòng đầu tiên có nghĩa là vagrant sẽ tạo 1 file configuration cho máy ảo (Vagrantfile) sử dụng lucid32 box. Trong Vagrantfile đã có sẵn sample configuration và comments nên chắc không cần giải thích thêm ở đây.

Dòng tiếp theo là khởi động máy ảo (tầm 1,2 phút tuỳ cấu hình máy chủ)

Cấu trúc thư mục trong vagrant
Điểm chính của vagrant là sử dụng máy ảo để chạy project trên môi trường Linux, và đồng thời vẫn tạo cho developers sự thoải mái để sử dụng IDE yêu thích.

Để làm được việc đó thì sẽ có 1 thư mục được chia sẽ giữa máy ảo và máy chủ. Mặc định thì thư mục đó là thư mục chứa file Vagrantfile. Tuy nhiên developer vẫn có thể sử dụng Vagrantfile để thêm vào nhiều thư mục khác.

Bên trong máy ảo thì thư mục share mặc định sẽ nằm ở /vagrant

Để vào bên trong máy ảo, thì dùng lệnh sau
Quote:
vagrant ssh
Forward port
Trong Vagrantfile sẽ có nhiều dòng như vầy
Quote:
config.vm.forward_port 80, 8080
config.vm.forward_port 5432, 9090
80 là port của web server chạy bên trong máy ảo
5432 là port của Postgresql server chạy bên trong máy ảo

Vagrant sẽ forward port 80 và 5432 của máy ảo về port 8080 và 9090 của máy chủ. Như vậy developers sẽ có thể access web server thông qua localhost:8080 và sử dụng Postgresql admin tool connect vào localhost:9090 để access Postgresql server.

Cookbooks
Trong vagrant, cookbooks là tập hợp của nhiều ruby files được dùng để provision máy ảo. Trong Vagrantfile, sẽ có configuration cho cookbook
Quote:
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = "cookbooks"
chef.add_recipe "vagrant_main"

chef.json = {}
end
Vagrant hỗ trợ provision thông qua chef solo, puppet và bash script. Trong bài này thì chỉ nói về chef solo

Chef solo sử dụng cookbooks để provision máy ảo, vì cookbooks chỉ là ruby code cho nên sẽ đảm bảo các máy ảo đều có chung 1 environment.

Cookbook có thể tham khảo ở đây
Bây giờ đi qua từng dòng của configuration trên
Quote:
chef.cookbooks_path = "cookbooks"
Vagrant sẽ tìm cookbooks trong folder cookbooks cùng level với Vagrantfile

Quote:
chef.add_recipe "vagrant_main"
Chạy recipe vagrant_main để provision

Cấu trúc thư mục của vagrant_main
Quote:
-vagrant_main
|--recipes
|----default.rb
|--templates
|----default
|------project.erb.conf
File quan trọng nhất là file default.rb, trong file này thì chỉ đơn giản là gọi các cookbooks khác
Quote:
require_recipe "build-essential"
require_recipe "nodejs"
require_recipe "redis"
require_recipe "openssl"
require_recipe "postgresql::server"
Từng cookbook sẽ có cách riêng để setup libraries

Quote:
chef.json = {}
Dòng này dùng để truyền thông số vào cookbook (version, path etc...), mỗi cookbook sẽ có những configurations khác nhau (Cái này phải đọc kĩ hướng dẫn sử dụng trước khi dùng)

Cách tắt vagrant
Lúc không cần tới 1 vagrant nữa
Quote:
vagrant suspend
Bật lại vagrant
Quote:
vagrant resume
Tắt (shutdown) vagrant
Quote:
vagrant halt
Lưu ý là khi halt thì lúc bật lại vagrant sẽ tốn thời gian hơn. Để bật lại vagrant sau khi halt
Quote:
vagrant up --no-provision
Nếu ko có "--no-provision" thì máy ảo sẽ được provision lại từ đầu (rất mất thời gian). Cách được khuyên dùng là suspend và resume

Last edited by FighterVn; 05-08-2012 at 23:05.
Reply With Quote
  #3  
Old 03-08-2012, 23:26
Senior Member
 
Join Date: 12-2009
Posts: 1,610
Re: Vagrant

Mình mới nghe cái này lần đầu, cần hỏi bác FighterVn 1 chút, thực chất cái VM này nó chạy Ubuntu ah?
Reply With Quote
  #4  
Old 03-08-2012, 23:33
Senior Member
 
Join Date: 06-2007
Posts: 590
Re: Vagrant

Quote:
Originally Posted by Keyboárd C@t View Post
Mình mới nghe cái này lần đầu, cần hỏi bác FighterVn 1 chút, thực chất cái VM này nó chạy Ubuntu ah?
VM thì chạy gì cũng đc, thường thì vagrant box sẽ chạy cùng 1 distro với production server
Reply With Quote
  #5  
Old 03-08-2012, 23:43
Senior Member
 
Join Date: 12-2009
Posts: 1,610
Re: Vagrant

Quote:
Originally Posted by FighterVn View Post
VM thì chạy gì cũng đc, thường thì vagrant box sẽ chạy cùng 1 distro với production server
Thank bác.
Chờ phần giải thích cách hoạt động 
Reply With Quote
  #6  
Old 04-08-2012, 01:41
Senior Member
 
Join Date: 07-2011
Posts: 153
Re: Vagrant

Bài chia sẻ rất hay , có cái để vọc rồi, thanks chủ thớt nhé, cái này mới biết