Серверное оборудование для бизнеса — надёжные решения для любых задач Подробнее →
Статья

Vagrant для тестовых окружений: быстрый старт

Vagrant для тестовых окружений: быстрый старт

«На моей машине всё работает» — классика жанра, которую Vagrant призван уничтожить ещё до появления контейнеров. Сегодня, когда Docker занял значительную часть этой ниши, Vagrant остаётся незаменимым там, где нужны полноценные виртуальные машины: тестирование ядра, работа с systemd, эмуляция multi-server окружений, тестирование Ansible-ролей на чистых системах.

Установка

# Ubuntu/Debian
wget https://releases.hashicorp.com/vagrant/2.4.1/vagrant_2.4.1-1_amd64.deb
sudo dpkg -i vagrant_2.4.1-1_amd64.deb

# macOS
brew install --cask vagrant

# Проверка
vagrant --version

Vagrant работает с провайдерами: VirtualBox (по умолчанию), VMware, libvirt, HyperV. Для Linux рекомендуется libvirt:

sudo apt install vagrant-libvirt
vagrant plugin install vagrant-libvirt

Первый Vagrantfile

Vagrantfile — это конфигурация вашего окружения на Ruby. Создаём минимальный:

mkdir my-lab && cd my-lab
vagrant init ubuntu/jammy64

Или пишем сами:

cat > Vagrantfile << 'EOF'
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/jammy64"
  config.vm.hostname = "test-server"

  config.vm.network "private_network", ip: "192.168.56.10"

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
    vb.cpus = 2
  end

  config.vm.provision "shell", inline: <<-SHELL
    apt-get update -q
    apt-get install -y nginx
    systemctl enable nginx
  SHELL
end
EOF

vagrant up

Основные команды

# Запустить VM
vagrant up

# Подключиться по SSH
vagrant ssh

# Остановить (сохраняет состояние)
vagrant halt

# Уничтожить VM полностью
vagrant destroy -f

# Перезапустить и применить новый provisioning
vagrant reload --provision

# Статус
vagrant status

# Статус всех VM в системе
vagrant global-status

Multi-machine: несколько VM одним файлом

Vagrant отлично подходит для эмуляции кластеров. Пример с двумя нодами:

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/jammy64"

  (1..2).each do |i|
    config.vm.define "node#{i}" do |node|
      node.vm.hostname = "node#{i}"
      node.vm.network "private_network", ip: "192.168.56.1#{i}"
      node.vm.provider "virtualbox" do |vb|
        vb.memory = "512"
      end
    end
  end

  config.vm.define "master" do |master|
    master.vm.hostname = "master"
    master.vm.network "private_network", ip: "192.168.56.10"
    master.vm.provider "virtualbox" do |vb|
      vb.memory = "1024"
    end
  end
end

Управление конкретной машиной:

vagrant up master
vagrant ssh node1
vagrant halt node2

Тестирование Ansible-ролей

Vagrant + Ansible — идеальная связка для разработки ролей:

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/jammy64"
  config.vm.network "private_network", ip: "192.168.56.20"

  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "playbook.yml"
    ansible.verbose = "v"
  end
end

После изменения роли достаточно:

vagrant provision
# или при необходимости полной пересборки:
vagrant destroy -f && vagrant up

Общие папки

По умолчанию директория с Vagrantfile монтируется в /vagrant внутри VM. Для настройки своих mount-точек:

config.vm.synced_folder "./data", "/srv/data",
  owner: "www-data",
  group: "www-data"

Итог

Vagrant не заменяет Docker для повседневной разработки, но занимает свою нишу там, где нужны настоящие VM. Тестирование системных конфигураций, отладка Ansible, воспроизведение окружения заказчика — для этих задач Vagrant до сих пор нет равных по удобству.

2 Ответа

  1. Vagrant с libvirt-провайдером работает заметно быстрее чем с VirtualBox — если вы на Linux, однозначно стоит потратить 10 минут на настройку и потом наслаждаться скоростью запуска VM.

  1. Хорошая тема для тестирования Ansible, но советую также посмотреть на Molecule — он специально создан для тестирования ролей и умеет работать как с Docker так и с Vagrant в качестве бэкенда.