Начало работы с Vagrant и зачем он вообще нужен
19 января 2015
В первом приближении Vagrant — это такой CLI для VirtualBox. То есть, утилита, которая говорит «создать виртуалку», «запустить виртуалку» и так далее. На самом деле, Vagrant представляет собой нечто куда большее. В частности, помимо VirtualBox есть немало других так называемых провайдеров — VMWare, Amazon EC2, LXC и libvirt.
Для каких задач может пригодиться Vagrant?
- Вам просто нравится CLI и нужна виртуальная машина чтобы с чем-то там поиграться;
- Такой жесткий способ изолировать ненадежное, например, в плане безопасности, приложение ото всей остальной системы;
- Быстрый способ развернуть на сервере какой-нибудь готовый LAMP ценой накладных расходов на виртуализацию;
- Проверить, как ведет себя распределенное приложение при сетевых проблемах и падении машин;
- Еще при тестировании удобно иметь какой-то начальный образ системы, к которому можно откатиться перед следующим прогоном тестов;
- И опять таки, тестирование — вы разрабатываете под x64 c 16 Гб памяти, а хотите проверить, что программа работает на x86 с 512 Мб памяти;
- Иногда выгоднее купить одну жирную тачку и разместить на ней несколько ВМ, чем покупать несколько физических машин;
- В ряде случаев с Vagrant’ом намного удобнее мигрировать приложение с хоста на хост (в частности, передать сайт другому владельцу);
- Как замена deb- и rpm-пакетам, которая умеет разрешать конфликты зависимостей всяких криво написанных приложений, как бы создавая для них «песочницы»;
- Вы сидите под Ubuntu, а вам для решения каких-то задач иногда нужна другая ОС — CentOS, FreeBSD, OpenBSD или Windows;
Как видите, штука полезная. Давайте же научимся ею пользоваться!
VirtualBox качаем отсюда, а Vagrant — отсюда. Устанавливаем:
sudo dpkg -i vagrant_1.6.5_x86_64.deb
Чтобы не возиться со всякими там ISO-образами в Vagrant есть такое понятие, как боксы. Бокс — это сохраненный образ системы. Чтобы создать новую виртуалку, вам нужен бокс. Когда вы архивируете состояние вашей ВМ, на выходе также получаете бокс. Скачаем бокс с Ubuntu 14.04:
vagrant box list
Теперь создадим новую виртуалку:
cd ~/vagrant/ubuntu-test
vagrant init ubuntu/trusty64
В каталоге появится файл с именем Vagrantfile. Здесь задаются параметры ВМ. Можно изменить ограничения по памяти и CPU, включить или отключить шаринг каталогов с хост-системой, поправить настройки сети, в том числе — настроить проброс портов из гостевой системы в хост-систему, и так далее. Кстати, по умолчанию все виртуалки находятся в одной виртуальной LAN и видят друг друга. Здесь и далее в качестве провайдера мы будем использовать VirtualBox. Он очень гибок в плане настроек. В частности, в Vagrantfile можно передать любые аргументы утилите VBoxMange, что не удивительно, так как под капотом всю виртуализацию Vagrant делает с ее помощью.
Чтобы у ВМ были красивые имена в интерфейсе VirtualBox, а также выводе vagrant global-status
, я всегда прописываю в Vagrantfile что-то вроде:
config.vm.define "ubuntu1" do |t|
end
# имя в VirtualBox
config.vm.provider "virtualbox" do |v|
v.name = "ubuntu1"
end
Запустим виртуалку и зайдем в нее по ssh:
vagrant ssh
# что дописать в ~/.ssh/config для входа в виртуалку:
# vagrant ssh-config
Тут следует отметить, что говоря vagrant up
вы должны находится в одном каталоге с Vagrantfile. При этом после запуска ВМ вы сможете обращаться к ней по id уже из любого каталога. А физически все виртуалки лежат вовсе не рядом с Vagrantfile, а в каталоге ~/VirtualBox VMs/. Есть подозрения, что интерфейс у Vagrant мог бы быть более однотипным, и от этого более простым и понятным, но уж как сделали.
Попав внутрь ВМ вы обнаружите, что работаете под пользователем vagrant, который может делать sudo без пароля. При этом есть возможность обмениваться файлами с хост-системой:
Файл hello появится в каталоге ~/vagrant/ubuntu-test хост-системы. В гостевой системе доступ к каталогу /vagrant/ имеет только пользователь vagrant. Если вдруг такой способ взаимодействия с гостевой системой кажется вам неудобным, ничто не мешает завести обычного пользователя, сказать ssh-copy-id и обмениваться файлами с помощью scp.
Если в хост-системе сказать:
… то можно увидеть все ВМ и их состояние.
Если ВМ удалялась не через Vagrant, она может остаться в global-status. Лечится это так:
Виртуалки можно ставить на паузу:
vagrant resume ubuntu1
Заметьте, что можно использовать не полный id вируталки (1f2a1a5), а только его начало (например, 1f). Кроме того, если вы присвоили ВМ имена, как было описано выше, то можно использовать их.
Полная останова и запуск:
vagrant up 1f
Удаление ВМ:
Можно создать из виртуалки бокс, сказав в каталоге с Vagrantfile:
Появится файл package.box (у меня он получился около 350 Мб). Упаковывать его не нужно, это уже сжатый файл.
Импорт бокса:
vagrant box list
vagrant box remove myubuntu
Часто требуется присвоить виртуалке фиксированный IP в LAN. Для этого находим в Vagrantfile строку, похожую на следующую, раскомментируем и правим:
Проверяем:
ping 10.110.0.10
В качестве примера альтернативного провайдера рассмотрим vagrant-lxc. Как вы догадались, он позволяет делать все, что было описано выше, используя LXC вместо VirtualBox. Если в двух словах:
vagrant plugin install vagrant-lxc
# создаем и запускаем виртуалку
vagrant init fgrehm/precise64-lxc
vagrant up --provider=lxc
Подробности можно найти на GitHub’е плагина.
Как видите, все довольно просто. Дополнительную информацию вы можете найти по следующим ссылкам:
- https://docs.vagrantup.com/v2/ — документация по Vagrant;
- https://atlas.hashicorp.com/boxes/search — каталог готовых боксов;
- http://stackoverflow.com/a/18104177/1565238 — автозапуск виртуалки;
- http://serverfault.com/a/358040 — оверхед, правда, в случае VMWare;
- https://groups.google.com/forum/#!forum/vagrant-up — список рассылки;
А пользуетесь ли вы Vagrant и если да, то для каких задач?
Дополнение: Также вас могут заинтересовать заметки Управление VirtualBox из консоли с помощью vboxmanage, Зачем нужен Docker и практика работы с ним и Туториал по контейнеризации при помощи LXC.
Метки: Linux, Виртуализация.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.