Nhiều bạn sẽ hỏi có Docker rồi thì học Vagrant làm khỉ gì nhỉ? Thực ra lúc tôi học Vagrant thì Docker cũng phát triển mạnh rồi, nhưng mà bạn cũng biết đấy, với nhiều công ty thì phát triển mạnh không có nghĩa là nó hoàn toàn Stable. Docker thời đó cũng vậy, đã làm gì có Docker for Mac hay for Window như giờ, tất cả đều phải chạy qua Docker Machine hết. Thậm chí hồi đó Docker-Compose còn chưa có, muốn Up, Down, Link các Service lại với nhau thật là mệt mỏi. Công ty bấy giờ đang theo nguyên tắc mà huyền thoại Toyota áp dụng "Chỉ áp dụng các công nghệ tin cậy, đã được kiểm chứng toàn diện, để phục vụ cho các quy trình và con người của công ty", nên bạn cũng biết vì sao rồi đó.
Nói vậy chứ thời đó dùng Vagrant cũng là chạy theo mốt, nhưng vì nó dễ hơn Docker nên mới chọn chứ chẳng phải lý do như ở trên tôi nói đâu. Ha Ha. Giờ ở công ty hiện tại của tôi tuy rằng Vagrant không còn được ứng dụng nữa (đã chuyển sang Docker) nhưng những người mới vẫn được hướng dẫn như một môn khởi đầu cho DevOps và Docker. Vagrant dễ vậy mà còn không học được thì sao mà học được Docker nhỉ? He He. Bạn đừng nghe, tôi chém đó.
Lan man quá nhỉ, bài viết này tôi sẽ viết khá dài và cung cấp cho bạn rất nhiều kiến thức về Vagrant về thế giới xung quanh nó. Vì thế bạn hãy chiu khó đọc hết nhé, tôi tin là sẽ không làm bạn mất thời gian vô ích đâu.
Chuyện bắt đầu từ khi tôi còn là thằng thực tập, hồi đó thế giới đã dùng Vagrant và Docker rất nhiều rồi, nhưng ở công ty mà tôi thực tập thì mới chỉ có vài anh em trong nhóm nghiên cứu của công ty là dùng và ứng dụng, nhưng họ cũng chả muốn nhân rộng vì hiệu quả không quá cao mà phải đi Train cho từng đội thì cũng vỡ mồm. Bạn muốn biết tại sao hiệu quả không cao thì cứ đọc tiếp xuống dưới.
Vốn tính tò mò sẵn, lại nghe lỏm được keyword nên thằng thực tập như tôi cũng về tìm hiểu thử, kiếm TUT trên mạng đọc và làm theo. Nhưng được 1-2 hôm thì tôi phải bỏ cuộc ngay, vì sự lằng bà nhằng của nó. Nào là phải biết dùng Command Line, nào là phải biết Linux, là phải biết cấu hình mạng trên trời dưới bể. Cái khỉ gì mà rắc rối quá vậy trời.
Khi bắt đầu được nhận vào làm nhân viên chính thức, một số anh em trong công ty đã rục rịch sử dụng Vagrant rồi. Ôi bỏ mẹ kiểu này không học chắc mình đi sau thời đại mất, vậy là cái tình máu chiến, tò mò của tôi lại thức dậy. Quả này kiên quyết nhé, khó ông cũng phải học cho bằng được. Sốc lại tinh thần, tôi gửi một cái Email cho toàn công ty rằng "Vào thứ 2, ngày này, giờ này, em có một bài trình bày về Vagrant, mời anh em trong công ty tới chém gió". Thú thực là lúc gửi cái Email đó tôi chả biết gì về Vagrant ngoài mấy cái kiến thức cóp nhặt mà mình đọc TUT trước đây. Nghĩ mà thấy mình liều, nhưng không sao, liều thường ăn nhiều.
Trước hôm trình bày 2 ngày, tức thứ 7, tôi bắt đầu học Vagrant, ôi mẹ ơi sao mà nản quá chừng, còn có 2 ngày nữa là phải trình bày rồi, mà đầu chả có gì cả, quả này mà huỷ hay nói không ra gì thì kiếm mo đâu mà đeo. Đầu tiên là đi tìm một đống TUT tiếng Anh và Video trước. Sau khi gom cũng kha khá rồi mới bắt đầu xem. Chẳng có gì mới cả, toàn những cái đã đọc rồi. Đầu tôi chợt loé lên 1 ý tưởng, mà cho tới giờ thì tôi thấy nó là ý tưởng thông minh nhất trong nhiều năm trở lại đây của tôi, đó là "Kiếm sách đọc". OK, bắt đầu nào, kiếm sách thôi. Lượn lờ Amazon, It-Ebooks cũng kiếm được 1 cuốn nghe khá kêu "Pro Vagrant", Ha Ha, quả này luyện xong thành Pro luôn. Tôi bắt đầu tự tin trở lại, lật từ trang 1, ôi mẹ ơi đúng cái con cần đây rồi. Vậy là 2 ngày thứ 7 và chủ nhật tôi chỉ có ăn, ngủ và cày cuốn sách đó. Kỳ thực mà nói thì nó cũng khá dài và toàn những thứ chưa từng học bao giờ. Sách đã đọc xong, tôi bắt đầu tổng hợp lại những thứ quan trọng mà cuốn đó nói trong 1 cái Note.
1. Vagrant là gì?
"Phần mềm tạo máy ảo" – sai rồi, đó là hiểu lầm mà rất nhiều người mới học thậm chí đã dùng Vagrant từ lâu vẫn lầm tưởng. Ha Ha. Không sao, hồi đầu tôi cũng vậy, và khi đọc cuốn sách trên tôi mới hiểu ra.
Vậy thực tế nó là cái khỉ gì nhỉ? Vagrant thực ra là một công cụ giúp tương tác với các công cụ tạo máy ảo thông qua dòng lệnh và file cấu hình. Vâng, nó không phải công cụ tạo máy ảo, hay công cụ ảo hoả. Nó chỉ đơn giản là kết nối tới các công cụ ảo hoả, khởi tạo, điều khiển, cấu hình các máy ảo.Vậy máy ảo để làm gì? Tất nhiên là máy ảo dùng để phát triển phần mềm rồi. Nhưng bạn cũng có thể dùng nó để chạy ứng dụng ở môi trường sản xuất (Production).
Nhưng nếu các công cụ tạo máy ảo như Virtual Box, VMWare, HyperV… đã đủ dùng rồi thì cần Vagrant làm gì? Tôi không biết định nghĩa đủ của bạn là gì, nhưng đám công cụ tạo máy ảo kia có cung cấp hệ lệnh dễ dàng sử dụng không? Có cung cấp một file cấu hình chuyên biệt cho các máy ảo không? Việc di chuyển, chia sẻ các máy ảo có dễ dàng không? Câu trả lời với Vagrant là "CÓ".
Lợi ích của Vagrant là gì khi nó chỉ có "mỗi" tác dụng là tương tác với các phần mềm ảo hoá? Như đã nói ở trên, có cung cấp các câu lệnh đơn giản, cung cấp các cấu hình dựa trên Vagrantfile, tương tác được với nhiều công cụ ảo hoá (tạo máy ảo), chia sẻ máy ảo của bạn dễ dàng thông qua Cloud, tích hợp tốt với các SCM Tool như Chef, Puppet…
Sẽ có người nói nếu tôi cài một máy ảo sau đó cài lên các công cụ cần thiết, đóng gói máy ảo thành File và rồi chia sẻ cho mọi người thì có khác gì Vagrant? Bạn đúng, nhưng trong trường hợp bạn thay đổi cấu hình máy ảo của bạn hay các cài đặt trên nó, trong khi bạn đã chia sẻ cho rất nhiều người và thậm chí nhiều Team, việc bắt chia sẻ lại File máy ảo cho tất cả mọi người một lần nữa là mất thời gian và có thể là bất khả thi. Nhưng với Vagrant thì nó hoàn toàn đơn giản, bạn chỉ việc chia sẻ lại File cấu hình Vagrantfile là xong. Ném nó vào thư mục dự án, commit lên Git Repository và ở bất cứ đâu người khác cũng có thể cập nhật được những thay đổi mới nhất trên máy ảo của bạn. Trong Aigle/Scrum nó còn thể hiện tính Minh Bạch của dự án đó :D. Tức là bạn làm gì thì tất cả mọi người khác đều phải biết, và để giúp cho ai cũng biết việc gì đang xảy ra người ta dùng Git để quản lí việc thay đổi các thành phần của dự án, trong đó có Môi trường phát triển, mà ở đây dùng Vagrant để quản lí thì ta có thể được xem xét thông qua việc thay đổi cấu trúc của Vagrantfile.
Một số thông tin thú vị:
- Vagrant được viết bằng Ruby. Ngôn ngữ khá hot hiện nay và cũng là ngôn ngữ Scripting, chạy Cross-Platform. Thế nên có thể bây giờ bạn sẽ biết thêm được Ruby không chỉ để làm Web nhé, mà thực tế thì mục đích ra đời của nó cũng không phải là làm Web đâu. He He.
- Tác giả của Vagrant mà Mitchell Hashimoto, chắc là người Mỹ gốc Nhật. Biết đâu vì thế mà anh ta chọn Ruby 😀 (Ruby cho người Nhật tạo ra).
- Hashicorp, công ty đứng đằng sau Vagrant khá nổi trong giới DevOps hiện giờ. Có rất nhiều công cụ khác ngoài Vagrant được công ty này tạo ra, trong đó có Packer (công cụ tạo Vagrant Box), Teraform và Consul (Service Discovery cho kiến trúc Microservice đang HOT hiện nay).
- Theo như nghiên cứu của tôi thì các phần mềm tạo máy ảo phổ biến hiện nay cung cấp các API và SDK để cho người lập trình có thể sử dụng một ngôn ngữ thứ 3 can thiệp vào hoạt động của máy ảo. Ví dụ như Virutal Box cung cấp các giao tiếp API thông qua COM Interface. Nếu bạn muốn tìm hiểu thêm sâu hơn về cách hoạt động của Vagrant thì hãy học Ruby, đọc code của Vagrant trên Github, nghiên cứu các API của Virtual Box và COM Interface, biết đâu bạn cũng sẽ viết ra được 1 phần mềm như Vagrant cho riêng bạn, hoặc đóng góp mã nguồn cho Vagrant cũng không biết chừng 😀
Kết thúc ở đây, ở phần sau tôi sẽ đi sâu hơn vào cách thức hoạt động của Vagrant cũng như chi tiết hơn về việc chạy Vagrant hiệu quả như thế nào. Tất nhiên, như tiêu đề bài viết, đó đều là những kiến thức mà tôi biết khi học Vagrant. Tôi tin là sau khi đọc xong loạt bài này, các bạn cũng sẽ làm việc tốt với Vagrant.