Cài đặt môi trường phát triển sử dụng Vagrant, knife và chef.
Mộ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.
- VirtualBox Download tại: https://www.virtualbox.org/wiki/Downloads
- Cài đặt vagrant: http://www.vagrantup.com/downloads-archive.html
- cái đặt plugin hỗ chỡ giữa vagrant và virtual box:
vagrant plugin install vagrant-vbguest
- Install Chef
sudo gem install chef -v 11.16.4 knife configure // run with default
2, Tạo project vagrant
mkdir vagrant_getting_started cd vagrant_getting_started mkdir share vagrant init
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
- 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.