Cài đặt môi trường phát triển sử dụng Vagrant, knife và chef.

vagrantMột vấn đề mà khá nhiều người lập trình viên gặp phải đó là sự khác nhau giữa môi trường phát triền(dev) và môi trường thật(production). Vậy có cách nào để để mỗi người dev đều có một môi trường  “production” hay không? và tất cả các dev trong cùng dự án có được môi trường giống nhau hay không? Có rất nhiều cách giải quyết vấn đề này, và đây là một cách mình đang sử dụng và muốn chia sẻ với mọi người. Tổng quan của phương pháp này là như sau:

Việc thứ 1:  Sử dụng một máy ảo trên máy local.

việc thứ 2: Cài đặt các thư viện cần thiết lên máy ảo đó như trên production

Việc thứ 3:  Thư mục chứa code để deploy trên máy server sẽ được share với máy của người phát triển.

Nhưng có cách nào để biến tất cả quá trình trên (cài đặt máy ảo, cài đặt các thành phần cần thiết trên máy ảo, share folder code giữa máy ảo và máy lập trình viên) thành một project và  để bất kỳ lập trình viên nào cũng có thể cài đặt trên máy mình chỉ bằng 1 vài dòng lệnh đơn giản. Cách giải quyết hết sức đơn giản đó là việc sử dụng kết hợp giữa:

Vagrant: Tự động download cài đặt máy ảo

knife, chef: Download cài đặt các thư viện một cách tự động lên máy ảo thông qua ssh

Vậy chúng ta hãy cùng bắt tay vào  thực hiện nó nào.

1, Install các thư viện cần thiết.

2, Tạo project vagrant

mkdir vagrant_getting_started
cd vagrant_getting_started
mkdir share
vagrant init
tại project sẽ thấy suất hiện file: Vagrantfile -> nơi cấu hình việc khởi tạo máy ảo.
Vagrant.configure(2) do |config|
config.vm.box = "centos_6.4_x64"
  config.vm.box_url = "http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box"
  config.vm.network :private_network, ip: "192.168.33.80"

  config.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2200
  config.vm.network :forwarded_port, guest: 80, host: 80

  config.vm.synced_folder "share/", "/home/vagrant/test_project",
  owner: "vagrant",
  group: "vagrant",
  mount_options: ["dmode=775,fmode=775"]

  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048", "--cpus", "4"]
  end

end
 Như các bạn thấy ở trên:
  • Dòng thứ 2,3 đã cấu hình một máy ảo centos 64bits được download về từ http://developer.nrel.gov.
  • Dòng thứ 4: cấu hình mạng network sử dụng IP 192.68.33.80
  • Dòng thứ 6,7 lần lượt cấu hình sử dụng ssh cùng các post của 2 máy.
  • Dòng thứ 9,10,11,12 lần lượt dùng để thưc hiện việc share folder giữa 2 máy. thư mục share/ của máy thật và thư mục /home/vagrant/test_project của máy ảo.
  • Các dòng cuối cùng sử dụng để thiết lập các thông số khác cho máy ảo. như ram, số cpu….

Để bắt đầu quá trình cài đặt máy chúng ta sử dụng lần lượt các câu lệnh sau:

vagrant up      // chạy cài đặt với cấu hình đã định sẵn
vagrant halt    // Tắt máy ảo, ngắt kết nối giữa 2 máy
vagrant destroy // Xoá máy ảo.

Tới đây chúng ta đã hoàn thành việc tự động dựng một máy ảo. Chúng ta sẽ tiếp tục thực hiện quá trình cài đặt các thành phần khác lên chiếc máy ảo này.

Để tiếp tục  chúng ta sẽ install knife-solo và librarian-chef sử dụng gem file. Tạo file Gemfile với nội dung như sau:

source "https://rubygems.org"

gem 'knife-solo'
gem 'librarian-chef'

Run lện sau để cài đặt.

bundle install        // install gem
librarian-chef init   // Tạo ra file Cheffile nơi khai báo các thư viện sử dụng trong chef 

Sau khi tạo ra file Chefile ta có thể thêm các thư viện để sử dụng như sau:

cookbook 'yum', '~> 3.5.3'

cookbook 'java', '= 1.7.0'

# mysql
cookbook "mysql", "5.6"

# scala
cookbook 'scala', '~>2.1.0'

cookbook 'nodejs', '~> 2.3.0'

cookbook 'npm', '~> 0.1.2'

Chạy lệnh download thư viện.

librarian-chef install

Sau khi chạy song bạn xẽ thấy xuất hiện thêm thư mục cookbooks nơi chứa các plugin vừa được down về.

Tiếp tục nào bây giờ chúng ta sẽ cấu hình tiếp knife-solo. Chạy lệnh

knife solo init .

sau khi chạy lệnh này sẽ có một số các folder được tạo ra. Nhưng chúng ta chỉ cần chú ý tới folder nodes. Nơi đây sẽ là nơi chỉ định các gói cần cài đặt lên máy ảo. Vào trong thư mục này tạo ra file test.json với nội dung như sau:

{
  "run_list": [
    "recipe[yum]",
    "recipe[java]",
    "recipe[mysql::server]",
    "recipe[nodejs]"
  ],
  "mysql":{
    "version":"5.6",
    "port":"3306",
    "server_root_password":"1"
  }
}

Như các bạn thấy ở trên run_list chính là nơi chúng ta khai báo các thứ cần cài đặt trên máy ảo.  Nhung khai bao nay se tuong ung voi cac folder trong thu muc cookbooks va site-cookbooks(thu vien tu tao cua nguoi dung). Phần mysql chính là nơi cấu hình cho mysql trong khi cài đặt.

Nào bây giờ chúng ta sẽ thực hiện việc dựng máy ảo. Cũng giống như lần trước bước đầu tiên sẽ là dựng máy ảo:

vagrant up

Bước tiếp theo sẽ là cấu hình SSH để có thể sử dụng knife trên máy ảo.

mkdir ~/.ssh
chmod 700 ~/.ssh
vagrant ssh-config --host test >> ~/.ssh/config

chú ý test chính là tên file trong thư mục nodes.

Tiến hành “sào nấu” các gói trên máy ảo sử dụng các dòng lệnh:

knife solo prepare test  // thực hiện cài đặt chef lên máy ảo
knife solo cook test     // install các gói thư viện đã khai báo lên máy ảo

quá trình cài đặt kết thúc sử dụng dòng lệnh ssh test để kết nối với máy ảo. Sau đó hãy kiểm tra các thành phần vừa cài đặt.

Tới đây chúng ta đã đi được hơn 1 nửa quãng đường phải làm. Chúng ta đã cài đặt được server, install các gói cần thiết lên server đó nhưng mới chỉ là install các gói một cách tự động. Vậy để tự tạo ra các phần cài đặt riêng của bản thân thì chúng ta sẽ làm như thế nào? Ngay sau đây mình sẽ tiếp tục hướng dẫn các bạn.

Giả thiết là chúng ta sẽ phải cài đặt play sử dụng activator 1.3.2 . Bước đầu tiên sẽ là tạo ra gói tên là play để chúng ra có thể cấu hình bằng tay.

knife cookbook create play -o site-cookbooks/

sau khi chạy tại site-cookbooks sẽ có folder play. Tại folder này:

  • Download activator-1.3.2.zip để vào thư mục: files/default/
  • Tại recipes/default.rb thêm vào dòng lệnh sau:
%w{unzip}.each do |name|
  package name do
    action [:install]
  end
end

username = "vagrant"

cookbook_file "/home/play-2.3.zip" do
  source "activator-1.3.2.zip"
  action :create
  mode 0644
  owner username
  group username
end

directory "/home" do
  owner username
  group username
  mode 0755
end

bash "install play-2.3" do
  user username
  cwd "/home"
  code <<-EOH

  unzip play-2.3.zip
  
  echo "export PATH=\\$PATH:/home/activator-1.3.2-minimal" >> /home/vagrant/.bashrc
  bash 
  rm -rf play-2.3.zip 
  EOH 
  creates "/play-2.3" 
end

Nhìn vào file trên chắc các bạn cũng đã hiểu phần nào.

đầu tiên chúng ta sẽ install unzip để giải nén file,

tiếp theo là tạo ra một file tên là play-2..3.zip tại thư mục /home của máy ảo. File này được lấy từ file activator-1.3.2.zip(file này là file được chúng ta để trong thư mục: files/default/)
bash “install play-2.3” -> Chỗ này chính là chỗ chúng ta chạy lệnh bằng tay

nào bây giờ hãy thêm

"recipe[play]"

vào run_list của test.json

{
  "run_list": [
    "recipe[yum]",
    "recipe[java]",
    "recipe[mysql::server]",
    "recipe[nodejs]",
    "recipe[play]"
    ],
  "mysql":{ 
    "version":"5.6",
    "port":"3306", 
    "server_root_password":"1" 
  } 
}

Và chạy lại

knife solo cook test     // install các gói thư viện đã khai báo lên máy ảo

Bạn sẽ thấy play được cài đặt trên máy ảo.

Tới đây mình đã giới thiệu cho các bạn một cách tổng quan về việc sử dụng Vagrant, knife-solo, chef. Bài viết còn nhiều thiếu sót mong  các bạn góp ý thêm.

Cảm ơn mọi người vì đã đọc tới tận cuối bài.

Add a Comment

Scroll Up