Что такое Vagrant: установка, запуск, использование
Vagrant — продукт компании HashiCorp, специализирующейся на инструментах для автоматизации разработки и эксплуатации. Он позволяет создавать и конфигурировать легковесные, повторяемые и переносимые окружения для разработки.
Первая задача любого разработчика на новом проекте - развернуть окружение. Как правило, она сводится к следующим шагам:
- Клонировать репозиторий с проектом.
- Поставить необходимые пакеты для работы (например, библиотеку для xml).
- Установить дополнительные программы, такие как базу данных.
- Правильно настроить конфигурационные параметры.
Без автоматизации подобный процесс может занимать как часы, так и целые дни, в зависимости от сложности проекта. Причем, для каждого человека в команде. Для каждой смены рабочей машины или после переустановки системы. Проблема усугубляется тем, что чем больше разработчиков на проекте, тем более разнообразные машины они используют, включая разные операционные системы. В подобном случае процесс настройки гарантированно будет разным, что является еще одним источником проблем. Весь процесс настройки должен быть где-то описан, но, как правило, эти описания быстро устаревают и их мало кто хочет поддерживать, а любые попытки поддерживать актуальность в конце концов угасают.
После добавления пары таких проектов операционная система становится сильно захламленной. Даже если вы не работаете над проектом, после включения компьютера начнут стартовать сервисы, которые требуются только для разработки.
Еще одна проблема - изменения. Практически любая перенастройка установленной конфигурации потребует ручного вмешательства, доустановки пакетов, программ или изменения конфигов.
И последнее: нередко требуется возможность развернуть проект и для не программистов, например верстальщиков или тестировщиков. Наличие даже хорошо описанного процесса установки мало им поможет.
Теперь можно попробовать сформулировать требования к идеальному окружению:
- Изолированность. Таким образом избегаются возможные конфликты с другими окружениями (например, основной системой) и основная система остается чистой.
- Повторяемость. Пересоздать рабочую среду можно за считанные минуты набрав буквально одну команду. Любое изменение распространяется сразу для всех.
- Переносимость. Окружение разворачивается под любой системой одним универсальным способом.
Vagrant создан для решения именно этих задач. Во многом его работа опирается на виртуализацию, для которой, по умолчанию, используется продукт VirtualBox. Но в отличие от обычной работы с виртуальной машиной, когда внутри нее стоит система с графической оболочкой, Vagrant создает виртуальную машину доступную только в терминальном режиме (через командную строку), при этом сама разработка продолжается на хост-машине, а вот запуск кода на выполнение происходит внутри машины. Другими словами, редактор ставится на вашу основную систему и код лежит также в ней. Vagrant прозрачно прокидывает код внутрь машины и позволяет его запускать.
Подготовка к работе
Использование Vagrant подразумевает некоторую настройку операционной системы и наличие определенных знаний:
- Нужно знать, что такое виртуализация и как работать с виртуальными машинами
- Командная строка - единственный способ взаимодействия с Vagrant. Если ваша операционная система Windows, то вам необходимо настроить её.
- Базовое знание сетей, понятие порта.
- На вашем компьютере должно быть хотя бы 4 гигабайта оперативной памяти, хотя даже с таким объемом, работать проблематично. Минимально комфортный уровень - 8 гигабайт.
Как установить Vagrant
Первым делом необходимо поставить систему виртуализации, например VirtualBox. Скачать его под вашу операционную систему можно здесь.
Затем скачайте установщик Vagrant под вашу операционную систему на странице Download.
Откройте терминал и убедитесь что Vagrant работает:
vagrant -v
Инициализация
Дизайн Vagrant предполагает, что мы создаем отдельную конфигурацию на каждый проект (а соответственно и виртуальную машину), а не одну на все. Инициализация выполняется в папке соответствующего проекта командой vagrant init ubuntu/xenial64
. В результате выполнения этой команды Vagrant создаст файл Vagrantfile. Внутри файла описана конфигурация виртуальной машины на языке Ruby. Не страшно, если вы не знакомы с ним, содержимое файла интуитивно понятно, а документация Vagrant достаточно подробна.
Кроме создания файла, Vagrant скачает на вашу машину образ (image) операционной системы, хранящийся под именем ubuntu/xenial64
. В данном случае речь идет про Ubuntu 16.04. Vagrant поддерживает каталог образов, созданных специально под работу с ним. При необходимости можно выбрать другой, посмотрев его имя в каталоге. Если открыть файл Vagrantfile, то можно увидеть что имя образа прописано внутри конфигурации:
Vagrant.configure('2') do |config|
config.vm.box = 'ubuntu/xenial64'
end
Рабочий процесс
Запуск
Старт выполняется командой vagrant up
. Она создает виртуальную машину и запускает ее. Если машина уже была создана (предыдущими запусками), то произойдет только старт.
В этот момент уже можно начинать работать с кодом, лежащим в той же папке, что и Vagrantfile. Все изменения автоматически оказываются внутри запущенной виртуальной машины.
Подключение
Для входа внутрь используется команда vagrant ssh
. После выполнения терминал подключается к машине в домашнюю директорию пользователя по умолчанию. Традиционно в Vagrant это пользователь с именем vagrant
. Теперь необходимо выполнить переход в папку /vagrant
. Именно в ней окажется код проекта.
Дальше можно действовать по старинке. Поставить все необходимые пакеты и зависимости, а затем запустить проект. Если это веб-сайт, то он запустится на определенном порту. По умолчанию все, что стартует внутри виртуальной машины, доступно только внутри. Для возможности обращаться к сайту с хост машины (через ваш любимый браузер), необходимо прокинуть соответствующий порт наружу. Об этом достаточно подробно рассказано в документации. Предположим, что внутри Vagrant сайт стартует на порту 8080, и вы хотите обращаться к нему снаружи. Для этого достаточно добавить в конфигурацию:
Vagrant.configure("2") do |config|
# ...
config.vm.network "forwarded_port", guest: 8080, host: 8080
end
Изменения применяются после перезагрузки машины. Для этого достаточно выполнить команду vagrant reload
.
Остановка
В конце работы не забудьте выполнить vagrant halt
, иначе машина останется запущенной и будет потреблять ресурсы. Если вы решили, что пора полностью все удалить и поставить заново, воспользуйтесь командой vagrant destroy
.
Конфигурация системы
Установка необходимых программ внутрь Vagrant традиционным способом — не самый лучший способ добиться повторяемости. По сути такой подход ничем не отличается от настройки проекта на основной системе. Для решения задачи настройки используются средства configuration management, подобные Ansible. Vagrant хорошо интегрируется с ними. Подробнее об этом можно прочитать в официальной документации, а в одном из репозиториев хекслета есть пример такой интеграции.
Плагины
Vagrant может расширяться плагинами. Полный список можно найти на wiki.
Самый важный из этих плагинов - vagrant-vbguest.
Не вдаваясь в подробности, он делает так, что ваша система всегда остается рабочей при обновлении виртуальной машины. Без него возможна ситуация, когда обновив виртуальную машину вы увидите, что папка с кодом перестала синхронизироваться, и внутри Vagrant её нет.
Решение проблем
- Убедитесь что в BIOS включены все необходимые параметры для нормального функционирования виртуализации.
- В Windows используйте имена пользователей, не содержащие кириллицы.
- Не запускайте Vagrant из под суперпользователя или администратора.
- Если вы испытываете проблемы со скоростью работы, то, возможно, причина в способе синхронизирования папки с проектом. Vagrant позволяет настраивать способ синхронизации.