28/8/2024
000 Vagrant - Tạo và quản lý máy ảo Virtualbox
Thật ra, sau khi làm việc với Vagrant
một thời gian rồi mình mới viết bài này. Bài viết mang mục đích chia sẻ kiến thức và trải nghiệm cá nhân thôi, nếu kiến thức bị sai sót chỗ nào mong các anh chị có thể góp ý cho em để cải thiện!
Vagrant là gì?
Vagrant là một công cụ để xây dựng và quản lý môi trường máy ảo.
Ví dụ: mình đang làm lab và muốn cài thử nginx xem cách cấu hình nó ra làm sao, thay vì phải cài lên máy host thì mình muốn tạo một con máy ảo để làm, các bạn sẽ làm gì? tải iso ubuntu sau đó bỏ vào virtualbox và cấu hình nó, sau này muốn sử dụng cho việc khác hoặc lúc cần sử dụng nhiều máy ảo thì sao? clone hay snapshot, tất nhiên là nó vẫn hoạt động rồi, nhưng rất vất vả và công việc lặp lại nhiều lần, khó quản lý nữa. Đó, bây giờ ta dùng Vagrant
để tự động hóa nó.
Những thứ cơ bản để sử dụng Vagrant
Để hiểu va sử dụng Vagrant
một cách cơ bản chúng ta cần nắm bắt những thứ sau:
- Vagrant CLI
- Vagrant Box
- Vagrantfile
Vagrant CLI
Nhắc tới CLI thi ai cũng biết rồi, mọi hoạt động sẽ thực hiện qua CLI.
Để cài đặt Vagrant CLI:
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install -y vagrant
Tham khảo thêm cách cài đặt cho các OS khác tại đây
Vagrant box
Là một file được đóng gói để sử dụng trong Vagrant. Nói dễ hiểu thì nó như một file snapshot trong đó có chứa OS và phần mềm.
Vagrant sẽ cấu hình ram, cpu, ip, ... rồi khởi động snapshot đó lên, thế là ta có một máy ảo.
Vagrantfile
Vagrantfile là một file mô tả cấu hình để xây dựng và quản lý máy ảo, nó sử dụng cú pháp của ngôn ngữ lập trình Ruby.
Đây là ví dụ về một Vagrantfile:
ENV["LC_ALL"] = "en_US.UTF-8" Vagrant.configure("2") do |config| config.vm.define "ubuntu" do |instance| instance.vm.box = "ubuntu/bionic64" instance.vm.hostname = "ubuntu" instance.vm.network "private_network", ip: "172.16.1.10" instance.vm.provider "virtualbox" do |vm| vm.name = "ubuntu" vm.memory = 2 * 1024 vm.cpus = 2 end end end
Đây là cấu hình tối thiểu và cũng là cấu hình thường xuyên sài nhất. Các bạn có thể thấy cấu hình máy ảo này có:
- hostname: ubuntu
- ip private: 172.16.1.10
- ram: 2 GiB
- cpu: 2
Về phần disk, mình có tìm hiểu nhưng vẫn chưa hiểu và thấy ít đụng đến nên mình bỏ qua.
Có hai cách để ssh vào máy ảo là sử dụng command của vagrant và sử dụng command ssh thông thường:
vagrant ssh ubuntu # ubuntu là tên máy ảo định nghĩa trong Vagrantfile ssh vagrant@172.16.1.10
Mặc định các box ở trên Vagrant Cloud đều có user mặc định là vagrant và password cho user đó là vagrant, thêm một điều nữa là có public key của Vagrant trong ~/.ssh/authorized_keys
. Đây là quy định khi bạn muốn public một Vagrant box.
Tự tạo một Vagrant box
Lần đầu mình sử dụng vagrant có ấn tượng xấu nên mình đã tìm hiểu để tự tạo box luôn.
Đầu tiên chúng ta cần một file iso Ubuntu 24 Server. Các bạn thích gì thì chọn đấy.
Tiếp theo cài đặt như bình thường.
Có hai lưu ý:
- Cài đặt openssh-server và cấu hình cho phép đăng nhập root và đăng nhập bằng public key:
PermitRootLogin yes
PubkeyAuthentication yes
- Thay đổi mật khẩu root, mình để là
root:root
Sau khi xong các bước trên, shutdown máy ảo.
Sử dụng câu lệnh sau để đóng gói máy ảo thành box:
# u24 là tên máy ảo
vagrant package --base u24 --output u24.box
File u24.box
này có thể lưu lại và để sài sau này hoặc đưa cho ai đó cũng được.
Thêm box này này vào hệ thống để vagrant có thể hiểu được và được lưu ở ~/.vagrant.d/boxes
với định dạng name/version/provider
:
vagrant box add --name u24 --provider virtualbox u24.box
# ~/.vagrant.d/boxes/u24/0/virtualbox/
Kiểm tra bằng command:
$ vagrant box list
u24 (virtualbox, 0)
ubuntu/focal64 (virtualbox, 20240821.0.0)
Như thế là tạo thành công một box rồi! Mình không có nhu cầu public box nên cũng không tìm hiểu thêm về phần này nên tới đây thôi. Tuy nhiên, bạn nào muốn public box thì xem thêm tại tài liệu chính chủ nha.
Lưu ý: Mình đang thực hiện lab trên PopOS (base ubuntu) và sử dụng virtualbox. Vagrant có cái gọi là
provider
chỉ các nhà cung cấp ảo hóa như Virtualbox, VMWare, ... xem thêm tại đây, vì virtualbox dễ sài (lúc trước mình có thử VMWare nhưng rất khó cấu hình và tài liệu cũng hiếm) nên mình chỉ tập trung mỗi virtualbox.
Sử dụng custom box
Thử viết một Vagrant file và chạy xem thế nào:
ENV["LC_ALL"] = "en_US.UTF-8" Vagrant.configure("2") do |config| config.vm.define "u24-demo" do |instance| instance.vm.box = "u24" instance.vm.hostname = "u24-demo" instance.vm.network "private_network", ip: "172.16.1.10" instance.vm.provider "virtualbox" do |vm| vm.name = "u24-demo" vm.memory = 2 * 1024 vm.cpus = 2 end end config.ssh.username = "root" config.ssh.password = "root" config.vm.provision "shell" do |s| ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_ed25519.pub").first.strip s.inline = <<-SHELL echo #{ssh_pub_key} >> /root/.ssh/authorized_keys useradd --create-home --user-group --shell /bin/bash self echo "self ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/self chmod 0440 /etc/sudoers.d/self mkdir -p /home/self/.ssh echo #{ssh_pub_key} >> /home/self/.ssh/authorized_keys chmod 0600 /home/self/.ssh/authorized_keys chown -R self:self /home/self/.ssh SHELL end end
Sử dụng command vagrant up
để khởi chạy.
$ vagrant up
Bringing machine 'u24-demo' up with 'virtualbox' provider...
==> u24-demo: Importing base box 'u24'...
==> u24-demo: Matching MAC address for NAT networking...
==> u24-demo: Setting the name of the VM: u24-demo
==> u24-demo: Clearing any previously set network interfaces...
==> u24-demo: Preparing network interfaces based on configuration...
u24-demo: Adapter 1: nat
u24-demo: Adapter 2: hostonly
==> u24-demo: Forwarding ports...
u24-demo: 22 (guest) => 2222 (host) (adapter 1)
==> u24-demo: Running 'pre-boot' VM customizations...
==> u24-demo: Booting VM...
==> u24-demo: Waiting for machine to boot. This may take a few minutes...
u24-demo: SSH address: 127.0.0.1:2222
u24-demo: SSH username: root
u24-demo: SSH auth method: password
u24-demo:
u24-demo: Inserting generated public key within guest...
u24-demo: Removing insecure key from the guest if it's present...
u24-demo: Key inserted! Disconnecting and reconnecting using new SSH key...
==> u24-demo: Machine booted and ready!
==> u24-demo: Checking for guest additions in VM...
u24-demo: The guest additions on this VM do not match the installed version of
u24-demo: VirtualBox! In most cases this is fine, but in rare cases it can
u24-demo: prevent things such as shared folders from working properly. If you see
u24-demo: shared folder errors, please make sure the guest additions within the
u24-demo: virtual machine match the version of VirtualBox you have installed on
u24-demo: your host and reload your VM.
u24-demo:
u24-demo: Guest Additions Version: 6.0.0 r127566
u24-demo: VirtualBox Version: 7.0
==> u24-demo: Setting hostname...
==> u24-demo: Configuring and enabling network interfaces...
==> u24-demo: Mounting shared folders...
u24-demo: /vagrant => /home/hehehe/workspaces/devops/003/vagrant
==> u24-demo: Running provisioner: shell...
u24-demo: Running: inline script
Bạn nào bị lỗi khi chạy vagrant up
mà hiện Range network...
gì gì đó thì các bạn có thể cấu hình như sau:
sudo mkdir -p /etc/vbox
echo '* 0.0.0.0/0 ::/0' | sudo tee /etc/vbox/networks.conf
sudo chmod 644 /etc/vbox/networks.conf
Lỗi đó tại đây, nó thuộc 6.7. Host-Only Networking
Vì tự tạo box và không sử dụng public key của vagrant nữa nên thay đổi phương thức đăng nhập mật khẩu, thêm hai dòng username
với password
đó.
Muốn thực hiện script sau khi chạy lên thì viết như ví dụ. Có thể chạy script bằng file nữa nhưng mình thấy ít khi dùng nên bỏ qua luôn. Bỏ qua thì sau sẽ học Ansible
để cấu hình nhiều máy ảo cùng lúc, ví dụ như setup cụm k8s,...
Câu lệnh hay dùng
Xem thêm tại đây
# đóng gói máy ảo
vagrant package --base u24 --output u24.box # thêm box vào Vagrant
vagrant box add --name u24 --provider virtualbox u24.box # danh sách các box được thêm Vagrant
vagrant box list # xóa box khỏi Vagrant
vagrant box remove u24 # tạo và cấu hình máy ảo
vagrant up # xóa hết máy ảo
vagrant destroy -f # xóa máy ảo tên ubuntu
vagrant destroy ubuntu # shutdown tất cả máy ảo
vagrant halt # áp dụng những thay đổi trong Vagrantfile
# nó tương đương việc halt sau đó up
# vd: đổi 2cpu lên 4cpu, tăng giảm ram,...
vagrant reload
Đây sẽ là nền tảng cho những bài viết tiếp theo trong tương lai của mình, bài viết đến đây là hết! Cảm ơn các bạn đã đọc bài viết và nếu có gì sai sót, góp ý hãy bình luận nha!