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 в репозитории и не полагаться на память о том, что было установлено вручную.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте