Серверная виртуализация

Vagrant для виртуальных лабораторий: boxes, providers и Vagrantfile

Как описать и повторно развернуть виртуальную лабораторию через Vagrant с VirtualBox, VMware Workstation или другим provider.

10 минут
абстрактная иллюстрация воспроизводимых виртуальных лабораторных стендов
Vagrant хранит описание лаборатории в Vagrantfile, получает базовый образ — box — и поручает создание виртуальной машины выбранному provider. Повторяемый стенд получается, когда в проекте зафиксированы доступная версия box, настройки VM, сеть и provisioning, а также документированы версии Vagrant, provider и внешние источники сценариев.

Что делает Vagrant и чем он отличается от гипервизора

Vagrant — это CLI-инструмент управления средой, а не гипервизор. Он читает Vagrantfile, скачивает или использует локальный box, вызывает provider для создания VM, передаёт ему параметры и запускает подготовку гостевой системы. Само выполнение гостевого кода, виртуальные процессоры, память, диски и сеть предоставляет provider и лежащий под ним продукт виртуализации.

КомпонентРоль
VagrantОписывает и оркестрирует жизненный цикл VM: up, halt, reload, destroy, provisioning.
ProviderАдаптер Vagrant к конкретной платформе виртуализации; принимает provider-specific параметры из Vagrantfile.
VirtualBoxНастольный гипервизор и распространённый локальный provider для Vagrant.
VMware WorkstationНастольный гипервизор; для управления из Vagrant применяется VMware provider и его компоненты.
BoxРаспространяемый базовый образ для конкретного provider, архитектуры и гостевой ОС.

Поэтому Vagrant не заменяет VirtualBox, VMware Workstation, Hyper-V, KVM/libvirt или серверную платформу. О различиях гипервизоров и уровнях виртуализации читайте в статье «Гипервизоры и типы виртуализации: Type 1, Type 2, полная и паравиртуализация».

Подготовьте хост и выберите provider

До создания проекта установите Vagrant для своей поддерживаемой хостовой ОС и один выбранный provider со всеми требуемыми компонентами. Набор поддерживаемых ОС, встроенных providers и дополнительные зависимости зависят от релиза Vagrant, provider и хостовой ОС: сверяйте матрицу совместимости в официальной документации Vagrant и документации provider.

  • VirtualBox: установлены Vagrant и совместимый VirtualBox. Для первого стенда обычно достаточно встроенного provider virtualbox.
  • VMware Workstation: установлены Vagrant, совместимый VMware Workstation и компоненты VMware provider для Vagrant. В зависимости от актуального выпуска это может включать отдельный плагин и служебный компонент; совместимость и лицензионные условия проверяют по документации Vagrant и VMware.
  • Другой provider: кроме Vagrant могут потребоваться отдельный плагин, локальная служба, API-доступ, драйверы или системные пакеты. Например, работа с KVM/libvirt относится к отдельному стеку; его подготовка описана в статье «KVM, QEMU и libvirt в Linux: установка, VM, virsh и Guest Agent».
Проверьте запуск Vagrant и посмотрите установленную версию.
vagrant --version
Вывод:
В выводе должна быть установленная версия Vagrant. Если команда не найдена, проверьте установку программы и переменную PATH.
Посмотрите установленные плагины Vagrant.
vagrant plugin list
Вывод:
Команда выводит установленные плагины, но не перечисляет все доступные providers: встроенный provider, например VirtualBox, может отсутствовать в списке. Фактическую доступность выбранного provider проверьте после создания проекта явной командой `vagrant up --provider=имя_provider`; при ошибке проверьте продукт виртуализации, плагин, служебные компоненты и совместимость версий.

Не смешивайте providers в одном первом запуске

Для одного стенда сначала выберите один provider и один вариант box. Поведение VM на VirtualBox, VMware и других providers не обязано совпадать: различаются виртуальное оборудование, сеть, общие папки и возможности образа.

Выберите box, совместимый с provider

Box — не универсальный файл виртуального диска. Это пакет с метаданными и файлами, подготовленный для определённого provider. В метаданных каталога box обычно указываются версии box, варианты provider, архитектуры, URL загрузки и контрольные суммы. Один издатель может публиковать отдельные варианты одного образа для virtualbox, VMware и других платформ — либо не публиковать нужный вариант вовсе.

  1. Выберите издателя box и проверьте в его карточке или документации поддерживаемую гостевую ОС, архитектуру, provider и условия использования.
  2. Выберите версию box, которая существует для нужного provider, и зафиксируйте её в Vagrantfile через config.vm.box_version.
  3. Проверьте, что образ предназначен для вашей архитектуры хоста и поддерживает нужный способ доступа, например SSH для Linux-гостя.
  4. Сверьте лицензию box и лицензионные условия гостевой ОС отдельно. Разрешение на загрузку одного образа не означает право распространять, модифицировать или использовать другой образ либо другую редакцию ОС.

Не рассчитывайте на переносимость box

Box для VirtualBox нельзя считать готовым box для VMware Workstation или другого provider. Даже если гостевая ОС сходна, форматы дисков, драйверы, сетевые адаптеры, guest additions и сценарии запуска могут различаться. Для смены гипервизора нужна отдельная проверка совместимого box и конфигурации.

Создайте каталог проекта и минимальный Vagrantfile

Ниже — сквозной пример для virtualbox. Сначала выберите существующие имя и версию box, затем замените ими значения publisher/box и required-box-version непосредственно в Vagrantfile. Значения CPU и памяти в примере также скорректируйте с учётом ресурсов хоста и требований гостевой ОС. Команды записаны для POSIX-совместимой оболочки; в PowerShell используйте эквивалентные команды создания каталога и перехода в него.

Первый воспроизводимый стенд на VirtualBox

В результате появится одна VM с отдельными именами на уровне Vagrant, гостевой ОС и VirtualBox.

  1. 1
    Выберите параметры проекта
    Подберите существующие имя и версию box для VirtualBox. Определите имя машины Vagrant, hostname гостя, отображаемое имя VM, число vCPU и объём памяти с учётом ресурсов хоста и требований гостевой ОС.
  2. 2
    Создайте проект и начальный Vagrantfile
    Команда vagrant init создаёт файл Vagrantfile. Замените его конфигурацией из следующего блока, подставьте выбранные имя и версию box и при необходимости измените ресурсы. Конфигурация явно задаёт provider, сеть, политику общей папки и provisioning.
  3. 3
    Проверьте синтаксис
    Запустите vagrant validate. Успешная проверка подтверждает синтаксис Vagrantfile, но не наличие box, совместимость provider или возможность запуска VM.
terminal
mkdir vagrant-lab
cd vagrant-lab
vagrant init
Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.define "lab" do |lab|
    # Замените значения на существующий box и его версию для VirtualBox.
    lab.vm.box = "publisher/box"
    lab.vm.box_version = "required-box-version"
    lab.vm.hostname = "lab-guest"

    # Частная сеть с адресом, выделяемым механизмом provider.
    lab.vm.network "private_network", type: "dhcp"

    # Для минимального стенда общая папка отключена явно.
    # Включайте её только поддерживаемым выбранным provider способом.
    lab.vm.synced_folder ".", "/vagrant", disabled: true

    lab.vm.provider "virtualbox" do |vb|
      vb.name = "lab-virtualbox"
      vb.cpus = 2
      vb.memory = 2048
    end

    lab.vm.provision "shell", inline: <<-SHELL
      set -eu
      install -d -m 0755 /opt/lab
      printf '%s\n' 'provisioned-by-vagrant' > /opt/lab/marker
      chmod 0644 /opt/lab/marker
    SHELL
  end
end
Проверьте Vagrantfile до скачивания образа и создания VM.
vagrant validate
Вывод:
Ожидаемый результат — сообщение, что Vagrantfile валиден. Если команда сообщает об ошибке, исправьте имя переменной, кавычки или структуру Ruby-конфигурации и повторите проверку.

В примере три имени решают разные задачи. config.vm.define задаёт имя машины в Vagrant: оно используется в командах вроде vagrant up lab. config.vm.hostname задаёт hostname внутри Guest OS. vb.name задаёт отображаемое имя объекта VM в VirtualBox. Они могут совпадать, но это не одно и то же.

Provider-specific параметры

Блок config.vm.provider "virtualbox" настраивает VirtualBox, но сам по себе не всегда выбирает provider для запуска. Выбор делайте явно через vagrant up --provider=virtualbox или поддерживаемую вашей версией Vagrant переменную VAGRANT_DEFAULT_PROVIDER. Имена параметров CPU, памяти, сети и shared folders, как и доступные режимы, зависят от provider, его версии и хостовой ОС. Сверяйте их с официальными руководствами Vagrant и выбранного provider.

Запустите VM и управляйте её жизненным циклом

Первый up при необходимости скачает box, создаст VM через VirtualBox, применит конфигурацию и выполнит provisioning. Явный параметр --provider исключает случайный выбор другого доступного provider.

Создайте и запустите машину `lab` через VirtualBox.
vagrant up lab --provider=virtualbox
Вывод:
Ожидаемый результат — завершение создания VM и статус `running`. При ошибке загрузки проверьте имя, версию и provider box; при ошибке создания — доступность VirtualBox, аппаратной виртуализации и достаточность ресурсов хоста.
Посмотрите состояние всех машин текущего Vagrant-проекта.
vagrant status
Вывод:
После успешного запуска для `lab` ожидается состояние `running`. Статус `not created` означает, что VM ещё не создана или была удалена; при другом provider укажите его явно при следующем `up`.
Подключитесь к Linux-гостю способом, который Vagrant получил из box и его SSH-конфигурации.
vagrant ssh lab
Вывод:
После подключения проверьте `hostname` и наличие файла `/opt/lab/marker`. Если SSH недоступен, сначала убедитесь в `vagrant status`, затем проверьте, что box поддерживает SSH и provisioning завершился без ошибки.
inside-guest
hostname
cat /opt/lab/marker
nproc

Для гостевых ОС без SSH способ подключения зависит от communicator и возможностей конкретного provider. Не подменяйте эту проверку попыткой подключиться по случайному IP: используйте способ, предусмотренный выбранным box и конфигурацией Vagrant.

ЗадачаКомандаРезультат
Остановить VM штатноvagrant halt labVM выключена, её файлы и конфигурация сохранены.
Применить изменённые настройки с перезапускомvagrant reload labVagrant перезапускает VM и передаёт изменённую конфигурацию provider.
Повторно выполнить provisioningvagrant provision labVagrant запускает provisioners вне зависимости от того, выполнялись ли они при первом up.
Перезапустить и применить provisioningvagrant reload lab --provisionVM перезапускается, затем выполняется provisioning.
Удалить VMvagrant destroy labVagrant запросит подтверждение и удалит созданную VM.
Создать заново после удаленияvagrant up lab --provider=virtualboxVM создаётся из зафиксированного box и текущего Vagrantfile.

Destroy удаляет VM

vagrant destroy удаляет виртуальную машину, созданную provider, и её виртуальные диски в рамках этого стенда. Не храните в такой VM единственную копию важных данных. Перед удалением сохраните нужные результаты за пределами VM или используйте согласованный механизм резервного копирования.

Добавьте shell provisioning без секретов

Provisioning автоматически подготавливает гостевую ОС после создания. В примере выше shell-сценарий создаёт каталог и файл-маркер; повторный запуск приводит к тому же результату. Это пример идемпотентности: скрипт можно применить повторно без накопления дубликатов и без требования ручной очистки.

Shell provisioning по умолчанию обычно выполняется при первом создании машины. Команда vagrant provision запускает его повторно, а vagrant up --provision и vagrant reload --provision позволяют совместить операцию с повторным применением. Идемпотентность не обеспечивается Vagrant автоматически: её должен реализовать автор сценария. Полную настройку ОС, контейнерной среды или приложений следует вести в профильных материалах, а не переносить в один большой Vagrantfile.

Не записывайте секреты в Vagrantfile

Пароли, токены, приватные ключи и учётные данные не должны попадать в открытый Vagrantfile, inline shell-скрипты и историю команд. Передавайте их через утверждённое хранилище секретов, защищённые переменные CI/CD или локальный исключённый файл по правилам команды. Не выводите секреты в журнал provisioning.

Храните описание стенда как код

Добавьте Vagrantfile, отдельные сценарии provisioning и документацию с версиями в систему контроля версий. Каталог .vagrant содержит локальное состояние конкретного развёртывания и обычно не нужен другим участникам проекта. Также исключайте секреты и локальные переопределения согласно принятой политике команды.

.gitignore
.vagrant/
.env
*.local
secrets/

Фиксация Vagrantfile не делает окружение полностью неизменным сама по себе. На результат также влияют релизы Vagrant и provider, версия и содержимое box, версия VirtualBox или VMware Workstation, плагины, обновления гостевой ОС, репозитории пакетов, DNS и другие внешние источники provisioning. Запишите эти зависимости в README проекта или в принятом реестре зависимостей; при необходимости сохраняйте проверенные артефакты и контрольные суммы в разрешённом внутреннем хранилище.

Особенности VMware Workstation и других providers

Для VMware Workstation нельзя просто заменить в команде слово virtualbox на vmware_desktop. Нужны совместимые Vagrant, VMware Workstation и VMware provider, а также VMware box, опубликованный для этого provider. Provider-specific блок в Vagrantfile будет иным: параметры отображаемого имени VM, ресурсов, сети и shared folders определяются документацией VMware provider.

  • До запуска через VMware проверьте текущий способ интеграции с Vagrant: требуемый плагин, служебные компоненты, поддерживаемые версии Workstation и Vagrant.
  • Проверьте лицензионные условия VMware Workstation, VMware provider и выбранного box для вашей редакции, региона и сценария использования. Условия поставки и доступные права меняются, поэтому их нельзя выводить из старых инструкций или условий другого продукта.
  • Явно укажите provider при запуске, например vagrant up lab --provider=vmware_desktop, только если именно такое имя provider указано в актуальной документации установленного компонента.
  • Не переносите без проверки параметры VirtualBox, включая vb.name, в VMware provider: это разные интерфейсы конфигурации.

Установка VirtualBox, VMware Workstation и создание первой VM через их графический интерфейс рассмотрены отдельно в статье «VirtualBox и VMware Workstation для лаборатории: выбор и первая VM». Названия разделов интерфейса, статусов и настроек у providers зависят от продукта, версии и хостовой ОС; сверяйте действия с официальным руководством выбранного provider.

Практическая проверка готового стенда

  1. Выполните vagrant status и убедитесь, что Vagrant-машина lab имеет статус running.
  2. Подключитесь предусмотренным методом: для Linux box из примера — vagrant ssh lab. Внутри гостя выполните hostname и проверьте ожидаемый hostname.
  3. Проверьте маркер provisioning: cat /opt/lab/marker должен вывести provisioned-by-vagrant.
  4. Проверьте выделенные ресурсы средствами гостевой ОС и сопоставьте их со значениями vb.cpus и vb.memory в Vagrantfile, учитывая возможные различия в отображении со стороны ОС.
  5. Откройте VirtualBox и убедитесь, что объект VM отображается под именем lab-virtualbox, заданным через vb.name.
  6. Выполните vagrant halt lab, затем снова vagrant up lab --provider=virtualbox и проверьте, что машина остановилась и снова запустилась без ошибок.
  7. Если стенд больше не нужен, выполните vagrant destroy lab и подтвердите удаление. Затем vagrant status должен показать, что машина не создана.

Локальная виртуализация для разработки, тестирования и лаборатории через Vagrant удобна именно как повторяемая среда на одном хосте. Она не заменяет проектирование серверной виртуальной инфраструктуры, отказоустойчивость, резервное копирование, мониторинг и эксплуатационные процессы. Для производственного уровня ориентируйтесь на статью «Как спроектировать виртуальную инфраструктуру для продакшена и 1С».

Термины в статье

Технология абстрагирования физических вычислительных ресурсов, позволяющая создавать виртуальные серверы, хранилища, сети и другие логические ресурсы.
Изолированная вычислительная среда с виртуальными процессорами, памятью, дисками и сетевыми адаптерами, в которой под управлением гипервизора работает гостевая ОС.
Виртуальное оборудование — логическая аппаратная платформа, которую гипервизор предоставляет ВМ: виртуальные процессоры, память, устройства и системную прошивку.
Программный слой, который абстрагирует ресурсы физического хоста, выполняет виртуальные машины и управляет ими.
Имя хоста — идентификатор узла в сети и операционной системе, используемый для отображения, журналирования и разрешения имени в IP-адрес при наличии DNS или hosts.
Командная оболочка — программа-интерпретатор, принимающая команды и запускающая процессы; в отличие от терминала, она обрабатывает синтаксис и сценарии.
Репозиторий пакетов — структурированный источник пакетов и метаданных, из которого менеджер пакетов получает версии ПО, зависимости, обновления и информацию о подписях.
Cloud-Init — система начальной настройки облачных экземпляров, применяющая метаданные и пользовательские данные при первом запуске виртуальной машины.
Операционная система, установленная в виртуальной машине и работающая под управлением гипервизора; не следует путать с хостовой ОС гипервизора типа 2.
Платформа виртуализации Microsoft с гипервизором типа 1, доступная как роль Windows Server и компонент Windows 10/11 Pro, Enterprise и Education.
Подсистема аппаратной виртуализации ядра Linux, предоставляющая пользовательским мониторам ВМ, обычно QEMU, интерфейс для запуска изолированных виртуальных машин.
libvirt — открытый набор библиотек, API, служб и утилит для унифицированного управления ВМ, контейнерами, сетями и хранилищами на платформах виртуализации.
SSH — криптографический сетевой протокол для удалённого доступа и передачи данных, аутентифицирующий стороны и защищающий сеанс от перехвата.
Vagrant — CLI-инструмент для воспроизводимого создания, настройки и управления средами разработки с помощью Vagrantfile и подключаемых провайдеров.
vCPU — виртуальный логический процессор, предоставляемый виртуальной машине; гипервизор планирует его выполнение на процессорных ресурсах хоста.
Oracle VirtualBox — кроссплатформенный гипервизор типа 2 для локального запуска ВМ на Windows, macOS, Linux и Oracle Solaris; базовый пакет открыт и доступен бесплатно.
VMware — бренд Broadcom и семейство продуктов виртуализации; серверная платформа vSphere объединяет гипервизор ESXi и средства управления vCenter Server.
VMware Workstation Pro — гипервизор типа 2 для создания и запуска виртуальных машин на компьютерах с Windows и Linux, преимущественно для разработки, тестирования и лабораторий.

Вопросы по теме

Все вопросы и ответы

Можно ли использовать Vagrant с VMware Workstation?

Да, но нужны совместимые версии Vagrant, VMware Workstation и компонентов VMware provider для Vagrant, а также box, опубликованный именно для этого provider. Параметры VirtualBox нельзя переносить без проверки: настройки ресурсов, сети, общих папок и отображаемого имени VM у VMware provider отличаются.

Нужен ли VirtualBox, чтобы Vagrant создал виртуальную машину?

Зависит от выбранного provider. Vagrant не является гипервизором: он читает Vagrantfile и поручает создание VM provider. Для локального стенда с provider virtualbox нужен совместимый VirtualBox; вместо него можно использовать VMware Workstation или другой подготовленный provider с подходящим box.

Подходит ли Vagrant для виртуализации разработки и тестирования?

Да, Vagrant удобен для повторяемых локальных сред разработки, тестирования и лабораторий на одном хосте. Он позволяет зафиксировать версию box, настройки VM, сеть и provisioning в Vagrantfile. Однако он не заменяет проектирование производственной инфраструктуры, отказоустойчивость, резервное копирование, мониторинг и эксплуатационные процессы.

Можно ли запустить box для VirtualBox в VMware Workstation?

Нет, считать такой box готовым для VMware Workstation нельзя. Box содержит файлы и метаданные для конкретного provider; могут различаться форматы дисков, драйверы, сетевые адаптеры, guest additions и сценарии запуска. Для VMware нужен совместимый VMware box и отдельная проверка конфигурации.

Что будет с данными после `vagrant destroy`?

VM и её виртуальные диски в рамках стенда будут удалены. Поэтому нельзя хранить в такой машине единственную копию важных данных. Перед vagrant destroy сохраните результаты за пределами VM или используйте согласованный механизм резервного копирования; затем машину можно создать заново из box и текущего Vagrantfile.

Почему `vagrant validate` проходит, а VM не запускается?

Потому что vagrant validate проверяет только синтаксис Vagrantfile. Успешная проверка не подтверждает наличие подходящего box, совместимость Vagrant и provider, доступность зависимостей или возможность фактически создать VM. Для запуска также нужны выбранный provider и совместимый вариант box.