Vagrant описывает виртуальную машину текстовым файлом: бокс, ресурсы, сеть, общие папки и провижининг. Коллега клонирует репозиторий, выполняет vagrant up и получает ту же среду, что и вы, без инструкции на две страницы. В 2026 году Vagrant не заменяет контейнеры, но остаётся удобным там, где нужна полноценная ВМ: своё ядро, systemd, модули и сетевые настройки. Ниже — установка, рабочий Vagrantfile, провижининг, отладка и подводные камни.
Зачем он нужен рядом с Docker
Контейнер запускает процесс в общем ядре, а Vagrant поднимает отдельную машину. Это важно для тестов systemd-юнитов, правил iptables, LVM, файловых систем и драйверов, а также для окружения, максимально похожего на сервер. Docker хорош для сервисов приложения, Vagrant — для инфраструктурных сценариев и обучения.
С Terraform инструмент не конкурирует: Terraform управляет облачными ресурсами, Vagrant — локальными стендами для разработки. Их часто сочетают, когда нужно поднять инфраструктуру в облаке и её локальную копию для отладки.
Установка и провайдеры
Vagrant — обёртка над провайдером виртуализации. На Linux типичный выбор — libvirt и KVM, на Windows и macOS — VirtualBox или Hyper-V. Плагин libvirt ставится отдельно, вместе с qemu-kvm и демоном libvirt.
sudo apt install qemu-kvm libvirt-daemon-system vagrant
vagrant plugin install vagrant-libvirt
vagrant --version
vagrant box list
Под Windows включённый Hyper-V конфликтует с VirtualBox, поэтому выбирайте один стек. С 2023 года Vagrant распространяется по лицензии BUSL: для личного и внутреннего использования он бесплатен, но коммерческое распространение и хостинг ограничены — в компании стоит свериться с условиями.
Первый Vagrantfile
Файл создаётся командой vagrant init с указанием бокса, но практичнее сразу писать его вручную и держать в репозитории.
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-24.04"
config.vm.hostname = "dev.local"
config.vm.network "private_network", ip: "192.168.56.10"
config.vm.provider "libvirt" do |lv|
lv.memory = 4096
lv.cpus = 2
end
end
Синтаксис — обычный Ruby, поэтому условия и циклы допустимы. Проверяйте файл через vagrant validate: команда ловит опечатки до скачивания бокса. Для VirtualBox блок провайдера называется vb, для Hyper-V — hyperv.
Боксы и версии
Бокс — это образ с метаданными. Версию фиксируют в Vagrantfile, чтобы стенд не менялся сам по себе после обновления образа.
vagrant box add bento/ubuntu-24.04 --provider libvirt
vagrant box outdated --global
vagrant box update
vagrant box prune
Образы кэшируются в ~/.vagrant.d/boxes и занимают десятки гигабайт. Очистка через prune удаляет старые версии, но не трогает те, что используются активными машинами. Корпоративный реестр боксов указывают в настройках, если прямой доступ к публичному каталогу закрыт политикой.
Провижининг
Провижининг превращает пустую машину в рабочую. Для небольших задач хватает shell, для повторяемых — Ansible.
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y nginx
SHELL
config.vm.provision "ansible" do |a|
a.playbook = "site.yml"
end
Отдельный provisioner file копирует файлы до запуска скриптов, а ansible_local избавляет от установки Ansible на хост — он работает внутри гостя. Блоки выполняются сверху вниз, как в обычном сценарии, поэтому порядок шагов лучше комментировать прямо в файле.
Скрипт выполняется при первом up; повторный запуск — vagrant provision или vagrant reload —provision. Провижининг должен быть идемпотентным: повторный прогон не обязан ничего менять, но и не должен требовать ручного вмешательства. Ansible удобен тем, что тот же плейбук применяется к реальным серверам.
Папки и сеть
Общая папка — самый частый источник проблем: права, скорость, символические ссылки. Вариант по умолчанию удобен, rsync предсказуем, NFS быстр на Linux.
config.vm.synced_folder ".", "/srv/app", type: "rsync",
rsync__auto: true, rsync__exclude: [".git/", "node_modules/"]
config.vm.network "forwarded_port", guest: 8080, host: 8080
Проверьте также время: гостевая машина без синхронизации уплывает после сна ноутбука, и apt начинает ругаться на подписи. Для libvirt доступен тип 9p, но на массовых операциях он медленнее rsync. Если приложение активно пишет файлы, тестируйте не только чтение, но и удаление с переименованием.
Для rsync нужен rsync внутри гостя, а изменения с хоста подхватывает vagrant rsync-auto. NFS требует сервера NFS на хосте и статического IP; на Windows этот тип недоступен. Права в общих папках часто не совпадают с ожиданиями приложения — проверяйте владельца и umask.
Несколько машин
Один Vagrantfile может описывать стенд из нескольких узлов: балансировщик, приложение и база.
config.vm.define "db" do |db|
db.vm.box = "generic/debian12"
db.vm.network "private_network", ip: "192.168.56.11"
end
Обращаться к машинам нужно по имени: vagrant ssh db, vagrant up web. Ansible получает инвентарь автоматически, если использовать соответствующий провижининг с группами. Такой стенд похож на docker compose, но каждая машина здесь полноценная и независимая.
Команды и диагностика
Ежедневный набор невелик, но экономит часы.
vagrant status
vagrant ssh-config
vagrant reload --provision
vagrant snapshot save clean
snapshot save и restore возвращают машину к известному состоянию перед рискованным экспериментом. global-status показывает забытые машины в других каталогах, флаг —prune убирает записи об удалённых. Если up падает, запустите его с VAGRANT_LOG=debug и посмотрите, на каком этапе возникает ошибка: скачивание бокса, сеть, монтирование папки или провижининг.
VAGRANT_LOG=debug vagrant up
vagrant global-status --prune
vagrant destroy -f
vagrant validate
Чек-лист
- Vagrantfile лежит в репозитории, версия бокса зафиксирована.
- Провайдер выбран один, плагин установлен, конфликтов нет.
- Провижининг идемпотентен и не требует ручных шагов.
- Тип общей папки проверен на права и скорость.
- Порты и приватные адреса не пересекаются с другими стендами.
- Есть снимок перед экспериментами и понятная команда destroy.
Итог
Vagrant даёт воспроизводимый стенд ценой одного текстового файла. Он не заменяет контейнеры и облако, но там, где нужна настоящая виртуальная машина, экономит время на объяснениях и ручной настройке. Начните с одного бокса и shell-провижининга, затем перенесите логику в Ansible и добавьте вторую машину. Главное — держать Vagrantfile в репозитории и не полагаться на память о том, что было установлено вручную.