Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Просто о Vagrant

Оригинал: Vagrant Simplified
Автор: Shawn Powers
Дата публикации: 25 сентября 2015 г.
Перевод: А.Панин
Дата перевода: 6 июля 2016 г.

Просто о Vagrant

Я могу с полной уверенностью заявить, что некоторые инструменты просто смущают меня. Я знаю, что они должны быть очень полезными, так как программы не набирают популярность благодаря своей примитивности (в отличие о телевизионных реалити-шоу, но это уже другой разговор). Vagrant смущает меня примерно так же, как Wine, Docker, Chief и бесконечное множество других замечательных инструментов, которые постоянно упоминаются различными людьми. Именно поэтому в рамках данной статьи я попробую максимально просто описать возможности Vagrant.

Не поймите меня превратно: я в состоянии выполнить операции, описанные в одном из многочисленных руководств и запустить виртуальную машину с помощью магической команды vagrant up. Дело в том, что я не люблю магию, связанную с компьютерами. Мне хочется знать, что именно происходит, для чего и куда смотреть в том случае, если что-то пошло не так. Моей конечной целью является получение достаточной информации для исправления проблем, возникающих при работе с данным инструментом. Ведь без понимания реального принципа его работы отказ магической команды будет вызвать лишь страх.

Что это такое

Если говорить максимально просто, Vagrant является оболочкой для программы виртуализации. По умолчанию этой программой является VirtualBox, хотя Vagrant может работать и с другими системами виртуализации. Эта информация была очень важна для меня, ведь граница между набором функций VirtualBox и операциями, выполняемыми средствами Vagrant, была достаточно размытой. Если вы используете Vagrant, вам даже не понадобится запускать VirtualBox - и это не шутка. Не произойдет ничего страшного, если вы запустите эту систему виртуализации самостоятельно, но стоит помнить о том, что Vagrant использует VirtualBox скорее в качестве инструмента, а не отдельной системы.

Другая причина, по которой это важно, заключается в том, что в описанных условиях между Vagrant и VirtualBox не должно быть взаимных зависимостей. Это означает, что вы можете брать файлы конфигурации виртуальных машин Vagrant и копировать их на другой компьютер, после чего они будут отлично работать на нем. В описанной ситуации будет просто использоваться копия VirtualBox, установленная на другом компьютере, а сам рассматриваемый инструмент будет работать аналогичным образом.

Когда имеет смысл использовать Vagrant?

Как и в случае чистки зубов с помощью расчески, использование Vagrant для развертывании постоянно работающих виртуальных машин в датацентрах является не лучшей идеей. Разумеется, вы можете использовать его для описанных целей, но Vagrant является действительно удобным инструментом для быстрого создания и уничтожения виртуальных машин после окончания работы с ними. Фактически, большинство людей использует Vagrant для выполнения одной из двух операций: создания окружения разработки для тестирования кода и создания по запросу временных серверов при повышении нагрузки.

Один из побочных эффектов использования Vagrant заключается в том, что вы начнете думать о хранении неизменяемых данных на постоянной основе за пределами сервера. Я обнаружил, что даже в тех ситуациях, когда Vagrant не используется, я дальновидно пытаюсь убедиться в том, что мои надежность хранения моих данных не зависит от единой точки отказа. Примером может служить директория /usr/local/bin. На большинстве моих машин в этой директории хранится огромное количество разработанных мной сценариев командной оболочки. Так как я использовал Vagrant, я рассматриваю эти сценарии, как данные, которые должны быть доступны всем моим машинам, но, возможно, не должны храниться на локальном накопителе сервера. Разумеется, я создаю резервные копии данных, но в случае хранения данных вне файловой системы одного из серверов, их перемещение на новый сервер значительно упрощается.

Какие операции на самом деле выполняются

Я уже упоминал о том, что Vagrant является оболочкой для VirtualBox. Конечно же, VirtualBox имеет интерфейс командной строки, но Vagrant является гораздо более мощным инструментом. Вместо установки операционной системы Vagrant принимает "шаблон", содержащий данные виртуальной машины с полностью установленной операционной системой и клонирует его. Это означает, что вы сможете работать с полноценной операционной системой спустя несколько секунд, а не тратить свое время на ее установку. В мире Vagrant упомянутые "шаблоны" называются "контейнерами" ("boxes"), причем вам не придется создавать их. Вы можете загрузить контейнеры с данными большинства дистрибутивов Linux и это означает, что вам не придется тратить время на их развертывание.

Существуют три основных директории, в которых хранятся файлы Vagrant. На Рисунке 1 показана диаграмма связей между ними.

Основные директории с файлами Vagrant

Рисунок 1. На самом деле, существуют лишь две директории, о содержимом которых стоит заботиться: директория .vagrant.d в вашей домашней директории и директория проекта, которую вы создаете

1) Система виртуализации:

По умолчанию это VirtualBox. Это основной программный компонент, который позволяет запускать контейнеры Vagrant, но не отслеживает состояние каких-либо файлов виртуальных машин, а также их конфигурацию. Данный подход чем-то напоминает подход, используемый окружением исполнения приложений на языке Python. Исполняемый файл Python должен быть установлен в систему, но он является всего лишь интерпретатором, который исполняет код на языке Python. В случае Vagrant происходит примерно то же самое. VirtualBox является всего лишь программой, которая используется Vagrant для запуска указанного кода. В том случае, если система виртуализации VirtualBox установлена, большую часть работы можно считать выполненной.

2) Директория .vagrant.d:

Для выяснения предназначения данной директории мне потребовалось некоторое время. "Контейнеры", о которых я упоминал ранее, загружаются в данную директорию, поэтому при создании новой виртуальной машины вместо повторной загрузки контейнера будет использоваться его локальная копия. После того, как я выяснил местонахождение данной директории, процесс исправления допущенных ошибок значительно упростился. Обычно я изучаю ту или иную технологию путем проведения серии экспериментов с ней, поэтому рано или поздно сталкиваюсь с различными отказами. На первых порах я не мог понять, как избавиться от некорректно загруженных контейнеров, но позднее выяснилось, что удаление соответствующих файлов из директории .vagrant.d, расположенной в моей домашней директории, позволяет решить возникшие проблемы.

3) Директория проекта:

Моей любимой функцией Vagrant является размещение файлов каждой виртуальной машины в отдельной директории. Все файлы, с которыми работает виртуальная машина, будут располагаться в этой директории, поэтому вам не придется беспокоиться о том, что файл конфигурации виртуальной машины расположен в одной директории, файл образа раздела жесткого диска - в другой и так далее… Кроме того, данная директория может быть создана где угодно и использоваться независимо от остальных директорий проекта. Она не будет зависеть даже от оригинального "контейнера", так как после ее создания в процессе создания проекта Vagrant контейнер будет клонирован в директорию проекта.

Директория проекта содержит файл конфигурации виртуальной машины Vagrant (Vagrantfile), который является единым конфигурационным файлом для виртуальной машины. Он содержит все параметры аппаратных устройств, которые были предоставлены вами в пользование VirtualBox (например, объем оперативной памяти и другие подобные параметры), а также может содержать стартовые сценарии, которые будут запускаться после создания виртуальной машины для настройки системы. Фактически, чаще всего файлы конфигурации виртуальных машин Vagrant используются после запуска сервера Chief по своему прямому назначению, а именно, для автоматической конфигурации виртуальных машин! К счастью, файлы конфигурации виртуальных машин Vagrant могут быть очень простыми, причем Vagrant по умолчанию создает такие файлы при создании виртуальных машин.

Пошаговое описание процесса создания виртуальной машины

Пришло время обсудить вопросы, рассматриваемые в большинстве руководств, посвященных созданию виртуальных машин с помощью Vagrant. Теперь, когда вы знаете о том, какие операции выполняются средствами Vagrant, процесс создания виртуальных машин будет еще более интересным и менее мистическим. А это пошаговое описание этого процесса:

1) Установка VirtualBox и Vagrant:

В основанных на Debian дистрибутивах, таких, как Ubuntu, вы можете просто ввести команду:

sudo apt-get install vagrant virtualbox

и дождаться установки программ. Нет никакой необходимости в запуске VirtualBox, нужно просто установить все соответствующие программные компоненты.

2) Загрузка файла контейнера:

Вам придется загрузить файл шаблона или контейнера в директорию .vagrant.d, находящуюся в вашей домашней директории. Для того, чтобы выбрать необходимый вам файл, нужно перейти по адресу http://vagrantbox.es и скопировать строку URL файла контейнера, с которым вы желаете начать работу. В данное время уже существует множество готовых к развертыванию контейнеров, поэтому вам придется лишь выбрать наиболее подходящий из них и скопировать соответствующую строку URL в буфер обмена. После этого для загрузки файла образа в директорию локального кэша следует ввести следующую команду:

vagrant box add ИМЯ http://example.com/boxurl/mybox.box

Обратите внимание на то, что вместо параметра ИМЯ должно быть использовано произвольное имя, выбранное для вашего контейнера. Если вы будете использовать образ Ubuntu 14.04, вы можете использовать имя, аналогичное "trusty64" для того, чтобы впоследствии было проще ссылаться на контейнер. С помощью приведенной команды будет осуществляться загрузка файла контейнера и сохранение этого файла под любым выбранным вами именем.

3) Создание директории проекта:

Теперь нужно создать директорию для хранения файлов виртуальной машины где-либо в файловой системе. Она действительно может располагаться в любой точке файловой системы. Обычно я создаю эту директорию на своем рабочем столе, для того, чтобы не потерять ее, с помощью аналогичной команды:

mkdir ~/Desktop/myfirstvm

После этого перехожу в эту директорию:

cd ~/Desktop/myfirstvm

4) Инициализация вашей виртуальной машины на уровне Vagrant:

Теперь следует просто ввести следующую команду:

vagrant init ИМЯ

В результате программа vagrant создаст файл конфигурации виртуальной машины Vagrant со стандартными параметрами конфигурации. По сути, он будет содержать информацию файле контейнера, который должен использоваться при создании виртуальной машины. Если вам нужны дополнительные параметры конфигурации в файле конфигурации виртуальной машины Vagrant (тему которых я затрону ниже), вы можете отредактировать его, но виртуальная машина будет отлично работать и в том случае, если этот файл не будет никоим образом редактироваться.

5) Запуск вашей виртуальной машины:

Файл конфигурации виртуальной машины был создан в директории myfirstvm, но сама виртуальная машина до сих пор не создана. Для того, чтобы создать ее, просто введите команду:

vagrant up

Обратите внимание на то, что вы должны находиться в директории myfirstvm для того, чтобы приведенная выше команда сработала. Это объясняется тем, что вы можете создать множество директорий с файлами виртуальных машин (например, mysecondvm) и единственным способом сообщить Vagrant о том, какую виртуальную машину вы желаете запустить, является исполнение команды в соответствующей директории. В результате Vagrant создаст виртуальную машину на основе ранее загруженного файла контейнера. Виртуальный жесткий диск и все файлы конфигурации будут сохранены в директории с именем .vagrant, расположенной в директории myfirstvm (обратитесь к Рисунку 1 за подробностями). На вашем экране будет отображена информация о процессе запуска компьютера, после окончания которого вы получите в свое распоряжение полноценную виртуальную машину.

6) Выполнение операций с вашей виртуальной машиной:

Этот этап стал еще одной точкой преткновения на пути моего знакомства с Vagrant. В моем распоряжении имелась работающая виртуальная машина, но как с ней взаимодействовать? К счастью, Vagrant поддерживает отличную технологию для взаимодействия с виртуальными машинами, а именно SSH. Если находясь в директории myfirstvm ввести следующую команду:

vagrant ssh

вы войдете в систему, выполняющуюся в рамках виртуальной машины, по протоколу SSH. Несмотря на то, что вы не знаете каких-либо паролей для входа в эту систему, вы всегда можете получить доступ к ней с помощью команды vagrant ssh, так как Vagrant автоматически создает пару ключей для входа в систему без использования пароля. После того, как вы вошли в систему, вы можете выполнять любые операции, включая смену паролей, установку программного обеспечения и так далее…

7) Управление вашей виртуальной машиной:

После выхода из системы, выполняющейся в рамках вашей виртуальной машины, вы вернетесь в директорию myfirstvm на вашей локальной машине. Виртуальная машина все еще будет работать, прчем вы можете использовать следующие команды Vagrant для управления ею:

  • vagrant halt - отключает виртуальную машину.
  • vagrant suspend - приостанавливает работу виртуальной машины.
  • vagrant resume - возобновляет работу виртуальной машины.
  • vagrant destroy - удаляет файлы виртуальной машины (но не файл конфигурации виртуальной машины Vagrant).

Направление последующего исследования

Я надеюсь, что теперь принцип работы Vagrant стал более очевидным для вас. На первый взгляд он является достаточно прозрачным, но не очень полезным, так как были рассмотрены лишь базовые функции данного инструмента. Хотя сами по себе функции быстрого создания и уничтожения виртуальных машин являются достаточно любопытными, их полезность сомнительна. К счастью, в Vagrant реализованы и некоторые другие замечательные функции. Я уже упоминал команду vagrant ssh, которая позволяет вам входить в систему, выполняющуюся в виртуальной машине, с использованием протокола SSH, но это лишь вершина айсберга.

Во-первых, из системы, выполняющейся в рамках виртуальной машины, всегда доступна директория /vagrant. Эта директория автоматически монтируется при запуске виртуальной машины и ссылается на директорию проекта в основной системе. Таким образом, любые файлы, хранящиеся в директории "myfirstvm" рядом с файлом конфигурации виртуальной машины Vagrant, будут доступны из директории /vagrant системы, выполняющейся в рамках виртуальной машины. Это особенно полезно, так как вы можете уничтожить виртуальную машину и создать новую, при этом все файлы из директории проекта не будут удалены. Данный механизм может успешно использоваться в том случае, если вам необходимо хранилище данных, содержимое которого не уничтожается при выполнении команды vagrant destroy, причем продуктивность его использования может быть значительно повышена в случае комбинирования со сценариями в файле конфигурации виртуальной машины Vagrant.

Сложно не согласиться с утверждением о том, что механизм создания виртуальных машин не является самым очевидным, тем не менее в файле конфигурации виртуальной машины Vagrant для автоматизации процессов создания и загрузки виртуальных машин используется популярный язык программирования Ruby. А это простой пример отредактированного файла конфигурации виртуальной машины Vagrant:

# Sample Vagrantfile with startup script
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "NAME"
config.vm.provision :shell, path: "startup.sh"
end

Единственной добавленной мной строкой является строка config.vm.provision. Все остальные строки были сгенерированы автоматически в результате выполнения команды vagrant init. Добавленная директива provision сообщает Vagrant о необходимости исполнения сценария startup.sh сразу же после запуска виртуальной машины. Но где можно найти этот файл сценария с именем startup.sh? Очевидно, что в доступной для виртуальной машины директории с именем "myfirstvm". Поэтому следует создать файл сценария с именем startup.sh в директории myfirstvm рядом с файлом конфигурации виртуальной машины Vagrant со следующим содержимым:

# This is the startup.sh file called by Vagrantfile
apt-get update
apt-get install -y apache2

Убедитесь в том, что этот файл является исполняемым:

chmod +x startup.sh

После этого позвольте Vagrant создать новую виртуальную машину. Если вы не уничтожили существующую виртуальную машину, сделайте это, после чего введите команду vagrant up для создания новой. На этот раз вы должны увидеть, что машина создана и запущена, при этом будет явно осуществлена загрузка и установка Apache ввиду исполнения файла стартового сценария startup.sh после запуска виртуальной машины!

Момент озарения

После того, как я понял, что Vagrant может вызывать сценарии в процессе создания виртуальных машин, я смог оценить всю мощь механизма автоматизации Vagrant. И, откровенно говоря, это всего лишь малая толика операций, которые могут выполняться с помощью команд из файлов конфигурации виртуальных машин Vagrant. С помощью этого файла вы можете изменять параметры самих виртуальных машин (объем оперативной памяти, время центрального процессора и так далее…); вы можете создавать правила проброса портов для доступа к портам сетевых служб исполняющейся в рамках виртуальной машины системы посредством соединения с соответствующими портами локальной системы (именно таким образом работает команда vagrant ssh); вы также можете осуществить полномасштабную настройку виртуальной машины с помощью такой программы, как Chief, которая должна быть запущена в процессе ее создания.

Vagrant не является отличным инструментом для решения любых задач, но если вам нужна быстрая и гибко конфигурируемая виртуальная машина с возможностью создания сценариев автоматизации, он вполне может подойти. После того, как я разобрался с принципом работы Vagrant, я стал относиться к данному программному компоненту не как к магической кнопке, а как к удобному инструменту. Но что делать, если вы нарушите структуру его файлов конфигурации в процессе своих экспериментов? Вам нужно будет просто удалить файлы из директории /home/user/.vagrant.d/ и начать работу с новой директорией проектов. Все настройки виртуальных машин хранятся в файлах конфигурации виртуальных машин Vagrant, причем эти файлы создаются автоматически после выполнения команды vagrant init.

Если вы хотите узнать больше о дополнительных параметрах Vagrant, вы можете обратиться к удобному веб-сайту с документацией проекта по адресу https://docs.vagrantup.com/v2. В самом крайнем случае вы можете самостоятельно выполнить команды из примера, который я привел выше. Вы наверняка высоко оцените скорость и возможности автоматизации процесса развертывания виртуальных машин в процессе работы с Vagrant.