Виртуальная машина VirtualBox распространяемая бесплатно уже давно пользуется популярностью среде админов и разработчиков, позволяя быстро создавать нужные окружения. Это очень удобная и понятная система, ориентированная на использование в десктопы. А поэтому все управление производится при помощи графического интерфейса, разобраться с которым под силу и новичку. Если МЬ не много проблем здесь никаких, но современные проекты имеют свойство обрастать конфигурациями и в итоге получается весьма сложная инфраструктура, управлять которой при помощи мыши становится не просто. Вот эту проблему и призван решить менеджер виртуальных окружений для разработки Vagrant (vagrantup.com), позволяющий из командной строки создавать копии виртуальных машин с заранее определенной конфигурацией и создавать конфигурации VM (Provisioning) по мере необходимости на лету. В базовой поставке Vagrant работает с VirtualBox, но система плагинов позволяет подключить другую систему виртуализации. НА сегодня открыт код плагинов для AWS (github.com/mitchellh/vagrant-aws) и Rackspace Cloud (github.com/mitchellh/vagrant-rackspace), по коммерческой подписке доступен плагин для поддержки VMware Fusion/Workstation.
Код самого Vagrant распространяется под лицензией MIT.
При этом Vagrant не создает виртуальную машину с нуля. Для удобства разработчиков проект предлагает несколько базовых образов (boxes), которые импортируются и в последствии используются для быстрого развертывания системы. И уже на основе boxes собирается гостевая ОС с нужной конфигурацией.
Для упрощения развертывания приложений в boxes предустанавливаются Chef и Puppet. Кроме этого нужные установки можно задавать при помощи shell. В состав окружений включается полный комплект для запуска и разработки приложений на Ruby.
Для доступа к VM используется SSH, возможен обмен файлами через расшаренную директорию.
Написан Vagrant на Ruby, установить можно в любой платформе для которой есть компоненты VirtualBox + Ruby. На странице загрузки (downloads.vagrantup.com) доступны пакеты для Win, Linux (deb и rpm) и Mac OS X.
Процесс установки и использования в Ubuntu прост. Скачиваем пакеты VirtualBox и Vagrant и ставим:
$ sudo dpkg -i virtualbox-4.2.10_amd64.deb
$ sudo dpkg -i vagrant_1.2.2_x86_64.deb
Этот вариант рекомендуется разработчиками для новой версии 1.2.x.
На момент написания статьи с последней актуальной версией VirtualBox 4.2.14 были проблемы при запуске Vagrant, поэтому пока лучше использовать 4.2.12 или тестовую 4.2.15. Как вариант выполнить:
$ cd ~/.vagrant.d/boxes/BoxName/virtualbox
$ openssl sha1 *.vmdk *.ovf > box.mf
Альтернативно для установки Vagrant можно использовать Ruby:
$ sudo apt-get install ruby1.8 ruby1.8-dev rubygems1.8
$ sudo gem install vagrant
Все настройки проекта производятся в специальном файле Vagrantfile (docs.vagrantup.com/v2/vagrantfile/). Чтобы не создавать шаблон вручную, его проще сгенерировать:
$ mkdir project
$ cd project
$ vagrant init
Теперь можно просмотреть внутрь и заполнить: установки VM (config.vm.*), подключение по SSH (config.ssh.*), параметры самого Vagrant (config.vagrant). Все они хорошо документированы, значение некоторых понятно и без объяснений.
На самом деле в процессе запуска используется несколько таких файлов, каждый последующий переопределяет предыдущий: встроенный в Vagrant (его изменить нельзя), поставляемый с boxes (упаковывается при помощи —vagrantfile), расположенный в ~/.vagrant.d и файл проекта. Такой подход позволяет использовать установки по умолчанию, переопределяя в конкретном проекте только то что необходимо.
Все установки производятся при помощи команды vagrant, список всех ключей можно просмотреть при помощи «-h». После установки мы не имеем ни одного образа, запуск «vagrant box list» выведет пустой список. Готовый box может находиться в локальной ФС или на удаленном сервере, в качестве параметра задается его имя по которому будем обращаться в проектах. Например, используем официальный Box Ubuntu 12.04 LTS предлагаемый разработчиками Vagrant.
$ vagrant box add precise64 http://files.vagrantup.com/precise64.box
Теперь к нему можно обращаться из Vagrantfile:
config.vm.box = "precise64"
Или проще сразу указать его при инициации проекта:
$ vagrant init precise64
Самый простой способ не требующий изучения Chef и Puppet это использовать для конфигурирования VM, стандартные команды оболочки, которые прописать прямо в Vagrantfile или еще лучше объединить в скрипт, который подключается так:
Vagrant.configure("2") do |config|
config.vm.provision :shell, :inline => "script.sh"
end
Теперь все команды указанные в script.sh будут выполнены при запуске VM.
При старте проекта будет создан ovf файл, можно просмотреть установки внутри при помощи графического интерфейса VirtualBox или команды VBoxManage:
$ VBoxManage import /home/user/.vagrant.d/boxes/precise64/virtualbox/box.ovf
Virtual system 0:
0: Suggested OS type: "Ubuntu_64"
(change with "--vsys 0 --ostype "; use "list ostypes" to list all possible values)
1: Suggested VM name "precise64"
(change with "--vsys 0 --vmname ")
2: Number of CPUs: 2
(change with "--vsys 0 --cpus ")
3: Guest memory: 384 MB
(change with "--vsys 0 --memory ")
Не всегда они удовлетворяют конкретным условиям, но используя настройки провайдера, можно легко изменить установки конкретной VM (что писать покажет пункт change with …):
config.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--memory", "1024"]
end
Запускаем и подключаемся к системе по SSH:
$ vagrant up
$ vagrant ssh
Чтобы остановить VM используется параметр halt или destroy (второй с очисткой всех файлов, в следующий раз все операции будут выполнены с начала), если нужно отправить в спячку «vagrant suspend» (вернуть resume).
Для примера работы с Chef можно использовать готовый рецепт, при помощи которого настроить APT и Apache2:
config.vm.provision :chef_solo do |chef|
chef.recipe_url = "http://files.vagrantup.com/getting_started/cookbooks.tar.gz"
chef.add_recipe("vagrant_main")
end
Чтобы обращаться к VM из вне, потребуется настроить проброс портов. По умолчанию производится проброс 22 -> 2222 позволяющий подключаться по SSH.
Добавляем в Vagrantfile:
Vagrant::Config.run do |config|
config.vm.forward_port 80, 1111
end
Теперь к вебсерверу можно обратиться перейдя по адресу http://127.0.0.1:1111/. Чтобы не настраивать окружение каждый раз, лучше собрать на его основе готовый пакет (package).
$ vagrant package --vagrantfile Vagrantfile--output project.box
Теперь файл project.box можно распространить среди остальных разработчиков, которые подключат его при помощи «vagrant box add project.box».
Это конечно самые простые примеры, всю остальную информацию можно найти на сайте проекта.
Permalink
//
Спасибо за пост. Никто не имел дело с KVM и OpenVZ провайдерами под Vagrant. Находил только Vbox,VMware, AWC — http://sysadm.pp.ua/linux/sistemy-virtualizacii/vagrant-begin.html , но как на счет этих?