Сразу хочу обозначить термин VM - виртуальная машина, это (guest-машина).

1. Первым делом нам понадобится уже установленная ось, можно зарегистрироваться на сайте vagrantcloud.com и затем в меню сайта выбрав Discover найти нужный BOX. Но, я не доверяю чужим BOX-ам и буду делать свой. Поэтому, давайте скачаем ISO например дистрибутива debian . Теперь нам нужнен VirtualBox (если у Вас его нет, то установите) в котором мы подключаем скачанный Debian.ISO и приступаем к установке.

2. У Вас запустился процесс установки Debian, где Вас попроят ввести различные данные, и это ключевой момент, т.к. разработчики Vagrant-a ввели :

  • Hostname: vagrant-, например: vagrant-debian-wheezy-86
  • Domain: vagrantup.com
  • Root Password: vagrant
  • Main account login: vagrant
  • Main account password: vagrant

а) нужно на VM установить SSH-сервер:

Sudo apt-get install openssh-server

иначе Vagrant ругнется так:

Failed to connect to VM!
Failed to connect to VM via SSH. Please verify the VM successfully booted
by looking at the VirtualBox GUI.

б) Оказывается, не смотря на то, что мы создали пользователя vagrant и всем пользователям назначили пароль vagrant, НУЖНО использовать SSH-ключи, несомненно это глупость, но что поделать. В комьюнити Vagranta по этому поводу существует соглашение, что Vagrant использует для подключения к VM приватный ключ https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant А мы должны в VM пользователю vagrant добавить публичный ключ https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub в его ~/.ssh/authorized_keys . Если этого не сделать, то Vagrant ругнется так:

SSH authentication failed! This is typically caused by the public/private
keypair for the SSH user not being properly set on the guest VM. Please
verify that the guest VM is setup with the proper public key, and that
the private key path for Vagrant is setup properly as well.

в) (возможно не обязательно) Теперь приступим к установке virtual box guest additions. Для этого нужно установить какие-то пакеты загловков:

sudo apt-get -y install linux-headers-$(uname -r) build-essential dkms

выключите VM и в окне VirtualBox выберите “Devices” и “Install Guest Additions”. Это приатачит “Guest Additions” к вашему VM-сидирому. Теперь осталось включить VM, примонтировать сидиром и установить “Guest Additions”.

sudo apt-get -y install linux-headers-$(uname -r) build-essential
mkdir /media/cdrom
mount /dev/cdrom /media/cdrom
sudo sh /media/cdrom/VBoxLinuxAdditions.run

г) (возможно не обязательно) зачем-то делаем группу админ, пользователям которой как я понял разрешаем входить по SSH без пароля:

adduser vagrant admin

Sudo не установлен по умолчанию в Debian , поэтому в моем случае придется его установить:

и запускаю программу правки файла /etc/sudoesr

открывается стандартный текстовый редактор (в моем случае nano), и в самом конце файла нужно добавить:

Defaults env_keep="SSH_AUTH_SOCK" %admin ALL=NOPASSWD: ALL Defaults:vagrant !requiretty

3. При создании VM (виртуальной машины) я дал ей название debian-wheezy-86 , соответственно у меня в директории где установлен VirtualBox, создалась директория debian-wheezy-86 , давайте зайдем туда:

cd /home/programs/VirtualBox

4. Установите Vagrant

sudo apt-get install vagrant

5. Можно приступать к созданию Vagrant BOX-а:

vagrant package --base debian-wheezy-86

и через минутку получаем файл package.box

6. Теперь нужно сообщить vagrant-у про этот box:

vagrant box add debian-wheezy-86 package.box

синтаксис: vagrant box add НАЗВАНИЕ ФАЙЛ.box

7. Можете удалить директорию с установленным Debian:

rm -rf /home/programs/VirtualBox/debian-wheezy-86

8. Создадим и настроим Vagrant-проект

mkdir vagrant_getting_started
cd vagrant_getting_started
vagrant init

8. Пропишем нужные настройки в файл Vagrantfile

# название виртуальной машины, которую собираемся использовать
config.vm.box = "debian-wheezy-86 "

# чтобы можно было отслеживать загрузку виртуальной машины
config.vm.boot_mode = :gui

# по данному IP можно будет добраться до виртуальной машины
config.vm.network:hostonly, "11.11.11.11"

# проброс портов (по порту 8080 из host-машины мы попадаем на 80 порт guest-машины)
config.vm.forward_port 80, 8080

# Расшариваем папку. Порядок аргументов: идентификатор, директория на guest машине, директория на host машине
config.vm.share_folder "myShareFolder", "/var/www", "./"

9. Запускаем машину:

и выглядит это так:

$ vagrant up
VM already created. Booting if it"s not already running...
Clearing any previously set forwarded ports...
Forwarding ports...
-- 22 => 2222 (adapter 1)
-- 80 => 8080 (adapter 1)
Creating shared folders metadata...
Clearing any previously set network interfaces...
Preparing network interfaces based on configuration...
Booting VM...
Waiting for VM to boot. This can take a few minutes.
VM booted and ready for use!
Configuring and enabling network interfaces...
Mounting shared folders...
-- v-root: /vagrant
-- myShareFolder: /var/www
$

Ваше первое виртуальное окружение Vagrant

  • Преимущества от использования Vagrant
  • Преимущества для одного разработчика
  • Преимущества для команды разработчиков
  • Преимущества для компании

Настройка проекта

  • Vagrantfile
  • Настройка Vagrant проекта
  • Настройка Web-проекта

Образы виртуальных машин (Виртуальные боксы)

  • Получение базового образа виртуальной машины
  • Удаление виртуальных боксов
  • Настройка проета для использования нужного виртуального бокса
  • Проверка настройки

Настройка SSH

Обеспечение для виртуальных боксов (Provisioning)

Проброс портов (Port Forwarding)

Пакетирование (Packaging)

Остановка виртуальных боксов (Teardown)

  • Suspend - уход в спящий режим с сохранением текущего состояния системы
  • Halting - обычное завершение работы
  • Destroing - завершение работы с очисткой всех файлов бокса

Быстрая пересборка

Н ачало

Vagrant это менеджер ваших виртуальных окружений для разработки. Фактически он является надстройкой над программой VirtualBox от Oracle , и обеспечивает быстрое создание и настройку виртуальных машин. Созданные таким образом виртуальные машины - боксы (boxes) используются разработчиками web-приложений для построения необходимой среды разработки. Затем они могут быть упакваны в специальные контейнеры (боксы), для установки и использования другими разработчиками в команде.

Г де взять VirtualBox

Vagrant полностью зависит от программы VirtualBox и использует ее для создания виртуальных образов. Основным назначением VirtualBox является полная виртуализация x86 оборудования. Это проект с открытым исходным кодом, который обеспечивает виртуализацию на профессиональном уровне и может быть использована как на серверах так и на десктопных компьютерах для построения виртуальных сред. VirtualBox доступен для Windows , Mac OS X , Linux и Solaris .

На текущий момент Vagrant поддерживает VirtualBox 4.0.x, 4.1.x и 4.2.x.

У становка Vagrant

Чтобы установить Vagrant , необходимо скачать соответствующий пакет или установщик с этой страницы загрузки и установить его, используя стандартную процедуру установки приложения на вашей системе. В операционных систмах Windows и Mac OS X после установки приложения будет доступна команда Vagrant из командной строки. На остальных систмах вам необходимо будет самим добавить этот путь /opt/vagrant/bin в переменную окружения PATH .

Если вы не нашли для вашей системы установщик Vagrant, то вы можете установить его используя RubyGems с помощью команды gem install vagrant . Но помните, что установка из пакетов или через установщик является наиболее предпочтительным способом установки приложения.

В аше первое виртуальное окружение Vagrant

В командной строке набирите:

$ vagrant init precise32-box

$ vagrant up

Эти команды необходимы для запуска виртуальной машины с помощью Vagrant . Учтите, что команды выше запускают полнофункциональную виртуальную машину на операционной системе Ubuntu 12.04LTS precise с объемом памяти по-умолчанию в 512Мб.

П реимущества от использования Vagrant

Многие Web-разрабочики используют виртуальное окружение для разработки своих Web-приложений. Все большую популярность сейчас набирают облачные сервисы для построения и развертывания виртуальных окружений для продакшена и разработки, начиная от EC2 , Rackspace Cloud и заканчивая более специализированными как EngineYard и Heroku . Vagrant реализует схожие принципы при создания виртуальных машин для локальной разработки и тестирования ваших приложений на рабочем компьютере. Такая организация работы повышает гибкость и продуктивность как вас так и вашей команды при разработке web-приложений.

Для развертывания и настройки виртуальных окружений Vagrant использует достаточно зарекомендовавшие себя технологии виртуализации в лице VirtualBox от Oracle и технологии автоматицированного развертывания приложений от Chef и Puppet .

П реимущества для одного разработчика

Использование однотипного окружения разработки для разных проектов расчитанных для разных версий языков программирования и фреймворков зачастую очень трудная задача. Как быть, если один проект работает на PHP4, второй на PHP 5.2.x, а третий на PHP 5.3.x или 5.4.x и его необходимо тестировать в той версии языка на которую он расчитан?

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

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

П реимущества для команды разработчиков

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

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

П реимущества для компании

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

Н астройка проекта

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

V agrantfile

Н астройка Vagrant проекта

Первым шагом для любого проекта Vagrant является создание корневой директории проекта и инициализация проекта:

$ mkdir my_vagrant_project

$ cd my_vagrant_project

$ vagrant init

команда vagrant init создаст файл Vagrantfile. Пока мы оставим этот файл как есть, но далее мы будем его редактировать для настройки виртуальной машины нашего проекта.

Н астройка Web-проекта

Теперь когда Vagrant настроен, давайте создадим небольшой web-проект, который будем потом использовать для демострации работы Vagrant . Создайте в корне Vagrant проекта (где расположен файл Vagrantfile ) индексный html файл:

$ echo "

Hello from a Vagrant VM

" > index.html

В принципе на этом настройка web-проета закончена.

О бразы виртуальных машин (Виртуальные боксы)

Следующим шагом после инициализации проета, является создание базового бокса. Vagrant не создает виртуальную машину с нуля. Он импортирует базовый образ виртуальной машины и запускает его, применяя затем все необходимые настройки заданные в конфигурационном файле Vagrantfile. Это упрощает жизнь пользователям Vagrant , т.к. им не надо тратиь время на настройку параметров виртуальной машины, таких как выделенная виртуальная память, объем диска, сетевые интерфейсы и пр.

П олучение базового образа виртуальной машины

В самом начале статьи мы уже скачали базовый образ 32-битной системы Ubuntu 12.04LTS precise и добавили его в Vagrant . Обратите внимание, что если вы уже скачали образ, то вам не нужно повторно каждый раз его скачивать при последующем запуске. Vagrant поддерживает загрузку образов как из Интернета, так и с вашего жесткого диска. В самом начале статьи мы запустили следующую команду:

$ vagrant box add precise32-box http://files.vagrantup.com/precise32.box

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

Адрес http://files.vagrantup.com/precise32.box мы использовали только один раз в самом начале, теперь подключать базовый образ мы будем из локального хранилища на жестком диске.

У даление виртуальных боксов

Таже просто как добавить, виртуальные боксы можно и удалить. Для этого используйте команду:

$ vagrant box remove my_box

При этом бокс удаляется физически с диска. После этого ни одна виртуальная машина созданная ранее на основе этого бокса не сможет быть запущена.

Н астройка проета для использования нужного виртуального бокса

Теперь, когда виртуальный бокс с именем precise32-box был добавлен в Vagrant мы можем добавлять его в наши проеты. Это делается путем записи в конфигурационный файл Vagrantfile следующей строчки:

П роверка настройки

На данный момент мы произвели самую базовую настройку нашего виртуального окружения. Мы не задали переброс портов (port forwarding) , свое обспечение для окружения (provisioning) и т.д. Но даже с такой базовой настройкой у нас получилась полнофункциональная виртуальная машина. Вы можете в этом убедится набрав следующую команду vagrant up из корневой директории проекта Эта команда запустит виртуальную машину. Чтобы остановить запущенную виртуальную машину и очистить место на диске, которое она занимала, нужно выполнить команду vagrant destroy :

$ vagrant up

$ vagrant destroy

Н астройка SSH

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

$ vagrant ssh

vagrant@vagrantup:~$

ВНИМАНИЕ: для пользователей Windows

Т.к. ssh-клиент по-умолчанию не распространяется на Windows платформе, то при запуске команды vagrant shh на Windows машине Vagrant выведет вместо окна терминала - окно с необходимой информацией для подключения к виртуальной машине по shh протоколу через ssh-клиент PuTTY :

PuTTY не распознает стандартные openssh ключи, поэтому вам придется преобразовать данный приватный ключь в формат .ppk с помощью утилиты puttygen , которая идет в комплекте с PuTTY .

Д оступ к файлам проекта с виртуальной машины

В запущенной через Vagrant виртуальной машине вы найдете расшаренную директорию, в которой находятся файлы вашего проекта. Эта директория располагается на виртуальной машине по этому пути: /vagrant . С виртуальной машины содержимое данной директории доступно как для чтения так и для записи.

О беспечение для виртуальных боксов (Provisioning)

Мы запустили с помощью Vagrant виртуальную машину, настроили подключение через ssh , и что дальше? Для нас как для разработчиков эта машина не представляет никакого инетерса, т.к. на ней, пока, ничего не установлено кроме оперционной системы Ubuntu . Для разработки нашего web-проекта нам необходимо из получившейся заготовки виртуальной машины сделать полноценное виртуальное окружение - максимально точную копию того, что у нас находится на рабочем сервере. Для этого нам надо установить нужное программное обеспечение, к примеру, nginx или Apache , php , ruby , MySQL и т.д., т.е обеспечить наш виртуальный бокс необходимой провизией (Provisioning)

Для этих целей Vagrant позволяет использовать на выбор одно из двух решений - это Chef (Chef-Solo) или Puppet . Также, при необходимости, вы можете расширять Vagrant и использовать другие средства автоматизированного развертывания приложений (но это уже не относится к теме данной статьи).

Н астройка Chef и Vagrant

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

Vagrant::Config.run do |config|

Config.vm.box = "precise32-box"

# Enable and configure the chef solo provisioner

Config.vm.provision:chef_solo do |chef|

# We"re going to download our cookbooks from the web

Chef.recipe_url = "http://files.vagrantup.com/getting_started/cookbooks.tar.gz"

# Tell chef what recipe to run. In this case, the `vagrant_main` recipe

# does all the magic.

Chef.add_recipe("vagrant_main")

З апуск!

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

После того как Vagrant завершит все необходимые действия и настройки системы, у вас будет полноценный настроенный web-сервер на виртуальной машине. Однако, пока вы еще не сможете увидеть свой web-проект на ней через браузер на вашем рабочем компьютере, т.к. мы еще не настроили проброс портов (port forwarding) .

Чтобы убедится всеже что наш простой сайт уже работает, вы можете подключится по ssh к виртуальной машине и в командной строке ssh-терминала набрать следующее:

$ vagrant ssh

vagrant@vagrantup:~$ wget -qO- 127.0.0.1

Hello from a Vagrant VM

vagrant@vagrantup:~$

П роброс портов (Port Forwarding)

Проброс портов позволяет задать номер порта на гостейвой машине (в данном случае на нашей виртуальной машине), который будет доступен извне на хост машине (т.е. на нашем рабочем компьютере). Это позволит нам обращаться к web-серверу установленному на виртуальной машине из браузера на нашем рабочем компьютере.

З адание номера порта для проброса

В данном случае мы хотим пробросить порт на котором работает сервер Apache. Проброс порта настраивается в файле Vagrantfile следующим образом:

Vagrant::Config.run do |config|

# Forward guest port 80 to host port 4567

Config.vm.forward_port 80, 4567

Как вы видите мы задали проброс портов с 80 порта (guest posrt) на виртуальной машине на 4567 порт (host port) на нашем рабочем компьютере. Теперь надо запустить виртуальную машину командой vagrant up или если она уже запущена, то перезагрузить командой vagrant reload . После этого можно в адресной строке браузера набрать адрес http://127.0.0.1:4567/ и он откроет нашу страничку с приветсвием:

Hello from a Vagrant VM

П акетирование (Packaging)

Итак, мы получили готовое для использования виртуальное окружение для нашего web-проекта. Но представьте ситуацию, что вы не один, а состоите в команде и вам надо обеспечить своих коллег такимже виртуальным окружением как и у вас. Что делать? Vagrant предоставляет для этого случая возможность создавать пакеты (packages) виртуального окружения. Эти готовые пакеты вы отдаете своим коллегам и они устанавливают их у себя на компьютере.

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

Перед тем как создать бокс убедитесь что ваше виртуальное окружение проинициализировано и запущено командой vagrant up .

С оздание VagrantFile"а

Сначала мы должны создать конфигурационный файл Vagrantfile , который затем будет помещен в созданный виртуальный бокс. На этот этапе важно убетиться, что ваше виртуальное окружение запущено командой vagrant up и работает HTTP доступ к нему. Теперь создаем файл Vagrantfile.pkg , который будет использоваться как Vagrantfile только для созданного бокса. Файл должен содержать следующую конфигурацию:

Vagrant::Config.run do |config|

# Forward apache

Config.vm.forward_port 80, 8080

$ vagrant package --vagrantfile Vagrantfile.pkg

vagrant package возьмет текущее запущенное виртуальное окружение и упакует его в бокс package.box в текущую директорию откуда была запущена команда (т.е. в корне нашего Vagrant проета). Опция --vagrantfile указывает, что бокс должен включать в себя файл Vagrantfile.pkg , чтобы при развертывании на другом компьютере была автоматически выполнена проброска портов (более попдробно см. ).

Созданный бокс можно теперь отдать другому участнику команды, чтобы он скопировал его к себе на рабочий комьютер и установил или выложить его в интернет, тогда его можно будет потом просто скачать на нужный компьютер и запустить. Бокс запускается на другом компьютере следующим образом:

$ vagrant box add my_box /путь/к/боксу/package.box

$ vagrant init my_box

$ vagrant up

После выполнения этих команд другой участник вашей команды получит готовое к работе виртуальное окружение (точную копию вашего виртуального окружения).

О становка виртуальных боксов (Teardown)

Чтобы завершить запущенное виртуальное окружение в Vagrant S uspend - уход в спящий режим с сохранением текущего состояния системы

Завершение работы с уходом в спящий режим выполняется командой vagrant suspend . При этом происходит сохранение текущего состояни виртуального окружения и затем завершение его работы. Для возобновления работы достаточно выполнить команду vagrant resume .

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

H alting - обычное завершение работы

Это завершение работы выполняется командой vagrant halt . При этом выполняется обячное завершение работы (как в обычной Linux системе при выполнении команды halt ). Чтобы возобновить работу виртуального окружения после такого выключения надо выполнить команду vagrant up .

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

D estroing - завершение работы с очисткой всех файлов бокса

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

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

Б ыстрая пересборка

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

Не переживайте! Все что необходимо вам сделать чтобы возобновить работу над проектом это просто заново запустить виртуальный бокс командой vagrant up . Вот и все. Через пять минут может больше или меньше, когда Vagrant запустит виртуальную машину и установит весь нужный софт вы спокойно можете приступить к разработке вашего старого проекта.

  • Available Vagrant Boxes - доступные образы Vagrant
  • www.vagrantbox.es - еще образы Vagrant

Что такое Vagrant?

Я бы описал Vagrant - как надстройка над виртуальными машинами (VirtualBox, VMWare) со своей инфраструктурой. Vagrant позволяет с помощью заранее подготовленных инструкций развернуть подобие серверного окружения на своей локальной машинке (сколько часов отладки было потрачено из-за отличий окружений (dev, test, prod), в которых запускается разрабатываемое ПО). Поговаривают, что Vagrant в силах решить эти проблемы. Проверим так ли это, и не принесет ли он больше сложностей нежели профита.

Определения

# название бокса на основе которого будет разворачиваться виртуалка

config.vm.box = "lucid10x64"

# Проброс портов (8080 нашей машинки на 80 виртуалки)

config.vm.network:forwarded_port, host: 8080, guest: 80

# 2х сторонняя синхронизация каталога (локальный, виртуальный)

config.vm.synced_folder "/home/stas/www/vagrant/src", "/var/www"

Примечание

По умолчанию текущий каталог проекта (в котором находится Vagrantfile ) уже синхронизируется с директорией /vagrant (в корневой на виртуальной системы). DocumentRoot веб сервера Apache завернут на этот же каталог. Поэтому, дополнительно синхронизацию на /var/www указывать не нужно, но я привел этот конфиг как пример для бокса, у которого не будет предустановленного Apache .

Примечание

Для проверки окружения виртуальной машины, нужно создать файл index.php внутри вашего проекта и перезагрузить конфиг Vagrant :

vagrant reload

После этого откройте в браузере страницу http://localhost:8080 - это и будет ваш index.php .

Подготовить окружение виртуальной машины (provision , обеспечение) под наш проект мы можем несколькими способами. Один из них, это запуск shell скрипта, в котором прописываются все действия необходимые для настройки окружения. Давайте установим mc ( пример установки Apache). Создайте в корне проекта файл bootstrap.sh :

#!/usr/bin/env bash

apt-get update

apt-get install mc

И пропишите в Vagrantfile что необходимо запустить этот скрипт после старта виртуальной машины:

config.vm.provision:shell, :path => "bootstrap.sh"

Перезагрузите конфиг с обновлением обеспечения :

vagrant reload --provision

Управление

Команды для управления виртуальной машиной:

vagrant ssh # подключиться по SSH под юзером vagrant

vagrant suspend # поставить на паузу

vagrant halt # выключить

vagrant reload # перезагрузить конфиг (без выполнения provision)

vagrant reload --provision

vagrant destroy # удалить виртуалку

vagrant box list # cписок доступных "боксов"

Будьте бдительны!

Пользователь vagrant имеет право выполнять команды под рутом (sudo ) без пароля.

Кастомизация

VAGRANT_HOME - переменная окружения, содержит путь к каталогу с VagrantBox"ами (как установить переменную окружения ).

Вопросы

В: Где будет расположен/скрипты код, с которым мы работаем? Постоянно синхронизироваться? А это быстро?

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

В: Сколько времени займет развертывание типичного LAMP сервера?

О: Скачивание Vagrant Box ~ 20 мин. Если файл конфигурации уже описан, тогда все зависит от окружения и зависимых пакетов - все зависимости будут скачиваться и устанавливаться (если только они не включены в сам бокс). Если вы только начинаете настройку окружения и виртуалки - готовьтесь потратить от часа на описание нужного окружения.

В: Средний расход ресурсов на обслуживание одного LAMP окружения?

О: Прикидываю как бы замерять расход памяти по нескольким процессам...

В первом приближении 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 virtualbox-4.3 _4.3.20-96996 ~Ubuntu~raring_amd64.deb
sudo dpkg -i vagrant_1.6.5_x86_64.deb

Чтобы не возиться со всякими там ISO-образами в Vagrant есть такое понятие, как боксы . Бокс — это сохраненный образ системы. Чтобы создать новую виртуалку, вам нужен бокс. Когда вы архивируете состояние вашей ВМ, на выходе также получаете бокс. Скачаем бокс с Ubuntu 14.04:

vagrant box add ubuntu/ trusty64
vagrant box list

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

mkdir -p ~/ vagrant/ ubuntu-test
cd ~/ vagrant/ ubuntu-test
vagrant init ubuntu/ trusty64

В каталоге появится файл с именем Vagrantfile. Здесь задаются параметры ВМ. Можно изменить ограничения по памяти и CPU , включить или отключить шаринг каталогов с хост-системой, поправить настройки сети, в том числе — настроить проброс портов из гостевой системы в хост-систему, и так далее. Кстати, по умолчанию все виртуалки находятся в одной виртуальной LAN и видят друг друга. Здесь и далее в качестве провайдера мы будем использовать VirtualBox. Он очень гибок в плане настроек. В частности, в Vagrantfile можно передать любые аргументы утилите VBoxMange , что не удивительно, так как под капотом всю виртуализацию Vagrant делает с ее помощью.

Чтобы у ВМ были красивые имена в интерфейсе VirtualBox, а также выводе vagrant global-status , я всегда прописываю в Vagrantfile что-то вроде:

# имя в `vagrant global-status`
config.vm .define "ubuntu1" do | t|
end
# имя в VirtualBox
config.vm .provider "virtualbox" do | v|
v.name = "ubuntu1"
end

Запустим виртуалку и зайдем в нее по ssh:

vagrant up
vagrant ssh
# что дописать в ~/.ssh/config для входа в виртуалку:
# vagrant ssh-config

Тут следует отметить, что говоря vagrant up вы должны находится в одном каталоге с Vagrantfile. При этом после запуска ВМ вы сможете обращаться к ней по id уже из любого каталога. А физически все виртуалки лежат вовсе не рядом с Vagrantfile, а в каталоге ~/VirtualBox VMs/. Есть подозрения, что интерфейс у Vagrant мог бы быть более однотипным, и от этого более простым и понятным, но уж как сделали.

Попав внутрь ВМ вы обнаружите, что работаете под пользователем vagrant, который может делать sudo без пароля. При этом есть возможность обмениваться файлами с хост-системой:

echo "hello from vagrant" > / vagrant/ hello

Файл hello появится в каталоге ~/vagrant/ubuntu-test хост-системы. В гостевой системе доступ к каталогу /vagrant/ имеет только пользователь vagrant. Если вдруг такой способ взаимодействия с гостевой системой кажется вам неудобным, ничто не мешает завести обычного пользователя, сказать ssh-copy-id и обмениваться файлами с помощью scp.

Если в хост-системе сказать:

vagrant global-status

… то можно увидеть все ВМ и их состояние.

Если ВМ удалялась не через Vagrant, она может остаться в global-status. Лечится это так:

vagrant global-status --prune

Виртуалки можно ставить на паузу:

vagrant suspend 1f2a1a5
vagrant resume ubuntu1

Заметьте, что можно использовать не полный id вируталки (1f2a1a5), а только его начало (например, 1f). Кроме того, если вы присвоили ВМ имена, как было описано выше, то можно использовать их.

Полная останова и запуск:

vagrant halt 1f
vagrant up 1f

Удаление ВМ:

vagrant destroy 1f

Можно создать из виртуалки бокс, сказав в каталоге с Vagrantfile:

Появится файл package.box (у меня он получился около 350 Мб). Упаковывать его не нужно, это уже сжатый файл.

Импорт бокса:

vagrant box add myubuntu package.box
vagrant box list
vagrant box remove myubuntu

Часто требуется присвоить виртуалке фиксированный IP в LAN. Для этого находим в Vagrantfile строку, похожую на следующую, раскомментируем и правим.

— это программа-ассистент по сборке и управлению виртуальными машинами. С её помощью можно автоматизировать процесс развёртывания кастомных (с пользовательскими настройками) виртуальных машин.

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

Как установить Vagrant в Linux

Поскольку Vagrant это всего лишь надстройка над VirtualBox , то начать нужно с установки VirtualBox .

Теперь, когда VirtualBox уже есть в вашей системе, то поищите vagrant в стандартных репозиториях вашей системы — скорее всего, он там уже есть.

Для установки в Ubuntu, Linux Mint, Debian, Kali Linux и их производные выполните команду

Sudo apt install vagrant

Для установки в Arch Linux, BlackArch и их производные выполните команду:

Sudo pacman -S vagrant

Как установить Vagrant в Windows

Для Vagrant в Windows также имеется графический установщик, скачайте его и выполните установку.

В качестве папки установки Vagrant выбирает не C:\Program Files\, а другую папку, это позволяет программе проще работать с разрешениями и правами доступа:

После перезагрузки откройте командную строку Windows. Это можно сделать нажав Win+x , в открывшемся окне выберите Windows PowerShell (администратор) . В открывшемся окне для перехода из PowerShell в командную строку введите

В этой консоли выполните команду:

Должна появиться стандартная справка по пользованию программой:

Если возникнет ошибка, либо просто для профилактики, выполните обновление плагинов:

Vagrant plugin update

Установка плагина vagrant-vbguest

vagrant-vbguest — это плагин Vagrant, который автоматически устанавливает в гостевые системы VirtualBox Guest Additions — гостевые дополнения VirtualBox.

Независимо от операционной системы, плагин должен устанавливаться одинаково следующей командой:

Vagrant plugin install vagrant-vbguest

Если в Windows у вас проблемы с установкой этого плагина, то попробуйте следующую команду:

C:\vagrant\vagrant\embedded\bin\gem.bat install vagrant-vbguest

Также в Windows файервол может запросить разрешение для выхода в сеть программой:

Плагин vagrant-vbguest запускается и используется по умолчанию всеми виртуальными машинами. Он запускается автоматически сразу после старта коробки (так в Vagrant называют виртуальные машины). Получается что он работает каждый раз при загрузке коробки, то есть при использовании команд vagrant up или vagrant reload . Он не будет работать при команде vagrant resume (или vagrant up на приостановленной коробке) чтобы не тратить время при возобновлении работы виртуальной машины.

Чтобы отключить этот плагин, в настройках виртуальных машин установите vbguest.auto_update на false .

Как пользоваться Vagrant

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

Например, offensive-security подготовили kali-linux-light ,

тогда установка и запуск выполняются командами:

Vagrant init offensive-security/kali-linux-light vagrant up

Примеры других популярных систем:

Для разных систем выделите отдельные папки, то есть запускайте приведённые выше команды в разных папках.

Vagrant умеет не только скачивать и запускать коробки, он также умеет запускать внутри них пользовательские скрипты — поэтому некоторые системы могут устанавливаться сложнее, чем показано здесь. Для них может потребоваться скачивание полного архива. Затем нужно будет перейти в папку, содержащую файл Vagrantfile и уже там запустить vagrant up .