Nếu bạn thấy cuộc sống nhàm chán và thiếu phần mềm ảo hóa để "chơi", thì hôm nay bạn sẽ hài lòng. Toàn bộ bài viết dành cho Vagrant – phần mềm wrapper cho triển khai và test ảo hóa.
Ý tưởng: giấu đi các lệnh rườm rà, cung cấp giao diện thống nhất, thêm vài buzzword như cloud... thành công nghệ hot mọi người bàn tán. Giống OpenStack, OpenShift, OpenCloud... Nếu thêm PostgreSQL, Jenkins, Node.js thìได้ điểm "modern, hip, cool". Trừ sự châm biếm, hãy xem công cụ này có ích, giá trị, vui không.
Từ ngữ rất cần thiết
Chút intro để bối cảnh. Vagrant ban đầu thiết kế để đơn giản hóa test phần mềm, phát triển và quản lý tài nguyên ảo hóa trong môi trường hỗn hợp, nhanh chóng. Ban đầu chỉ làm việc với VirtualBox (không phải hypervisor phổ biến trong ngành), nhưng gần đây hỗ trợ thêm VMware, KVM... với tích hợp hay.
Tóm lại: dùng lệnh vagrant thay vì lệnh native. Bạn có thể có nhiều hypervisor, mỗi cái cú pháp khác, gây overhead. Vagrant che giấu phần xấu xa sau lớp abstraction hy vọng linh hoạt. Đủ lời, đi thực hành.
Cài đặt
Để thú vị, tôi KHÔNG demo trên Linux. Đợi đã, w00t. Dùng Windows để thêm đa dạng. Bài tiếp theo quay lại Linux, nhưng ở đây muốn chứng minh về mặt khái niệm, không có sự khác biệt.
Mở PowerShell, gõ lệnh. Ví dụ chạy Vagrant: vagrant up. Nếu chưa chuẩn bị môi trường, sẽ lỗi xấu:
PS C:\HashiCorp\Vagrant\bin> .\vagrant.exe up A Vagrant environment or target machine is required to run this command. Run `vagrant init` to create a new Vagrant environment...
Sau khi init, bắt đầu làm việc. Nhưng vẫn lỗi:
PS C:\HashiCorp\Vagrant\bin> .\vagrant.exe up Bringing machine 'default' up with 'virtualbox' provider... ==> default: Box 'base' could not be found. Attempting to find and install... default: Box Provider: virtualbox default: Box Version: >= 0 ==> default: Adding box 'base' (v0) for provider: virtualbox default: Downloading: base default: An error occurred while downloading the remote file... Couldn't open file /HashiCorp/Vagrant/bin/base
Mặc định Vagrant Windows cố gắng start VM từ base image. Image không có sẵn, nên up fail nếu không chuẩn bị trước.
Đầu tiên: pull image. Giống Docker, Vagrant có repo online lưu template cơ bản. Có thể cài OS thủ công nhưng mất ý nghĩa abstraction. Pull image:
vagrant box add hashicorp/base
Nếu image không tồn tại, lỗi 404. Vấn đề do khai báo mặc định trong config file. Sửa trong Vagrantfile: thay config.vm.box = "base" bằng image có sẵn (Ubuntu, Fedora, CoreOS...). Chúng ta test CoreOS (yungsang/coreos) vì lý do sau này. Pull image:
vagrant box add yungsang/coreos
Kiểm tra đã add:
PS C:\HashiCorp\Vagrant\bin> .\vagrant.exe box list ubuntu/trusty64 (virtualbox, 20150506.0.0) yungsang/coreos (virtualbox, 1.3.8)
Chạy lại Vagrant. CoreOS khởi động, setup user, network... Sau lúc, hệ thống chạy. SSH vào host: mặc định mỗi instance gán port trên localhost. Ở đây SSH chạy port 2222 trên 127.0.0.1. Rất giống Docker. Gợi ý: có lý do tốt.
PS C:\HashiCorp\Vagrant\bin> .\vagrant.exe up Bringing machine 'default' up with 'virtualbox' provider... ==> default: Importing base box 'yungsang/coreos'... ==> default: Matching MAC address for NAT networking... ==> default: Checking if box 'yungsang/coreos' is up to date... ==> default: Setting the name of the VM: bin_default_1431611566870_38538 ==> default: Clearing any previously set network interfaces... ==> default: Preparing network interfaces based on configuration... default: Adapter 1: nat ==> default: Forwarding ports... default: 22 => 2222 (adapter 1) ==> default: Running 'pre-boot' VM customizations... ==> default: Booting VM... ==> default: Waiting for machine to boot. This may take a few minutes... default: SSH address: 127.0.0.1:2222 default: SSH username: core default: SSH auth method: private key default: Warning: Connection timeout. Retrying... ==> default: Machine booted and ready!
Kết nối vào máy ảo
VM đang chạy. Check vagrant status. Dùng vagrant ssh hoặc vagrant rdp để vào VM. Có cách nâng cao hơn, sẽ bàn ở bài sau về networking và cluster.
Windows client dùng RDP, nhưng không work với CoreOS (không có RDP). Không chắc VNC có được không, chưa test. SSH cũng vấn đề: Windows không có SSH agent mặc định, PuTTY có thể không trong PATH.
PS C:\HashiCorp\Vagrant\bin> .\vagrant.exe rdp default ==> default: Detecting RDP info... RDP connection information for this machine could not be detected... PS C:\HashiCorp\Vagrant\bin> .\vagrant.exe ssh default -- -A `ssh` executable not found in any directories in the %PATH% variable. Is an SSH client installed? Try installing Cygwin, MinGW or Git... Host: 127.0.0.1 Port: 2222 Username: core Private key: C:/Users/<user>/.vagrant.d/insecure_private_key
Cần convert OpenSSH key sang PuTTY format. Không phải ai cũng gặp, nhưng hữu ích thấy giải quyết vấn đề tương tự nhiều cách.
Lúc này đã launch thành công instance Vagrant VM đầu tiên, dùng VirtualBox provider, nhưng chúng ta chưa gặp lệnh VirtualBox rõ ràng, không lo XML... Chỉ là khởi đầu, cũng là kết thúc bài hôm nay. Kết thúc trên nốt cao.
Tài liệu tham khảo thêm
- Introducing Vagrant, bài Linux Journal
- Crash course on Vagrant
- Docker networking thingie
Kết luận
Vagrant có vẻ thú vị, nhưng có thể không phải cách tốt nhất giải quyết thách thức môi trường bạn. Nếu muốn thực sự làm chủ ảo hóa, kiểm soát mọi khía cạnh setup, phải đầu tư thời gian, máu, kiên nhẫn học bottom-up. Nếu không, khi sự cố xảy ra (chắc chắn sẽ có), bạn không giải quyết được, cũng không hiểu công nghệ.
Nhưng là một góc nhìn thú vị, chúng ta sẽ thấy Vagrant đi bao xa. Ít nhất đã xử lý vấn đề cài đặt, cấu hình ban đầu, học pull image và start, check cơ bản, workaround network. Rất hữu ích. Sắp tới: framework plugin quan trọng, mở rộng kết nối VMware, LXC, libvirt, networking nâng cao, cluster setup... Stay tuned.
Cheers.