Vagrant#

Vagrant — это интересный инструмент для создания тестовых окружений.

Фактически это обёртка над гипервизорами (KVM, VirtualBox), которая позволяет быстро поднимать виртуальные машины заданных конфигураций. Это действительно удобно, когда надо что-то проверить на сервере. Вместо покупки VDS у хостера ты быстро разворачиваешь машину прямо на своём компьютере, а потом убиваешь когда она уже не нужна.

Из фич могу отметить:

  • Проброс портов на хост-систему

  • Можно подключать директорию на хосте к виртуалке подобно Docker volume

  • Из одного Vagrantfile поднять несколько виртуальных машин, связанных в приватную сеть.

  • Можно использовать cloud-init и подобные системы для конфигурирования машины при её создании.

Пользователи Arch Linux здесь могут столкнуться с проблемами из-за дурдома с зависимостями. Мне пришлось даунгрейдить Ruby до версии 3.0.4-5, а Vagrant до версии 2.2.19-2.

Примечание

UPD: Vagrant 2.3.2 и Ruby 3.0.4p208 прекрасно уживаются вместе.

Так как у меня не завёлся VirtualBox (не больно и нужен), я решил использовать KVM/QEMU, он у меня уже был установлен как зависимость для GNOME Boxes. Если нет, то надо установить:

sudo pacman -Sy qemu dnsmasq bridge-utils virt-manager libvirt

Команды, которые я выполнял:

# Даунгрейд рубей
sudo pacman -U file:///var/cache/pacman/pkg/ruby-3.0.4-5-x86_64.pkg.tar.zst
# Даунгрейд самого Vagrant
sudo pacman -U https://releases.hashicorp.com/vagrant/2.3.0/vagrant-2.3.0-1-x86_64.pkg.tar.zst
# Поднимаем юниты systemd для libvirt
sudo systemctl start libvirtd.service
sudo systemctl start virtnetworkd.service
sudo systemctl start virtnetworkd-ro.socket
# Ставим плагин для libvirt. Тут нам потребуется включить прокси, так как
# Hashicorp россиян не любит и будет показывать фиктивную 404-ю ошибку.
vagrant plugin install vagrant-libvirt
# Vagrant будет мусорить в рабочий каталог, поэтому создадим диру
mkdir vagrant && cd vagrant
# Инициализируем вагрант
vagrant init generic/ubuntu2204

Далее я столкнулся с тем, что у меня уже есть стандартный системный сторадж пул «images» и вагранту это не нравится. Чтобы использовать локальный пул я указал в настройках vagrant-libvirt URI qemu:///session.

В итоге у меня получился такой Vagrantfile:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  # The most common configuration options are documented and commented below.
  # For a complete reference, please see the online documentation at
  # https://docs.vagrantup.com.

  # Every Vagrant development environment requires a box. You can search for
  # boxes at https://vagrantcloud.com/search.
  config.vm.box = "generic/ubuntu2204"

  # vagrant-libvirt configuration. See
  # https://github.com/vagrant-libvirt/vagrant-libvirt/blob/main/docs
  config.vm.provider :libvirt do |libvirt|
    libvirt.uri = "qemu:///session"
    libvirt.storage_pool_name = "vagrant-pool"
    libvirt.cpus = 2
    libvirt.memory = 2048
    libvirt.storage :file, :size => '15G'
  end

  # Network settings
  config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
end

Далее я создал новый пул специально для Vagrant по инcтрукции рэдхата.

mkdir -pv $HOME/.local/share/vagrant_pool
virsh pool-list --all
virsh pool-define-as vagrant-pool dir - - - - "$HOME/.local/share/vagrant_pool"
virsh pool-build vagrant-pool
virsh pool-start vagrant-pool
virsh pool-autostart vagrant-pool
virsh pool-info vagrant-pool

Для сети скорее всего хватит сделать от рута:

sudo virsh net-start default

Это поднимет интерфейс virbr0 для будущих виртуалок.

Наконец, можно запустить виртуалку (не забываем включить прокси для скачивания образа):

# vagrant up --provider=libvirt ИЛИ
export VAGRANT_DEFAULT_PROVIDER=libvirt
vagrant up

На запущенную виртуалку можно зайти по SSH командой vagrant ssh.