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 до сих пор нет равных по удобству.
Vagrant с libvirt-провайдером работает заметно быстрее чем с VirtualBox — если вы на Linux, однозначно стоит потратить 10 минут на настройку и потом наслаждаться скоростью запуска VM.