Vagrant — виртуализация рабочего окружения



Как и всем дотнетчикам, мне приходилось работать со стеком технологий, основанных на Windows. Но иногда я озирался вокруг и изучал то, что мне казалось интересным, пока не наткнулся я на Ruby On Rails. Все было отлично, вот только инструментарий на Windows оставлял желать лучшего.

Как вы, должно быть, знаете, Ruby On Rails предоставляет великолепные инструменты командной строки, облегчающий работу с фреймворком. Так повелось, что для Windows консоль никогда не была сильной стороной. К тому же все эти инструменты, портированные на Windows, были крайне задумчивыми. По ощущениям, на одной и той же машине, команды rails, выполненные в Windows и выполненные в Linux, но запущенной в виртуальной машине, различались в отклике в несколько раз, а порой и на порядок. А ведь при изучении, важна каждая секунда. Нужно и в rails console поиграться с написанным, и сервер запустить, увидеть свой результат, и миграцию провести, а ждать при этом не хочется.

Когда я только приступал к изучению, слышал множество мнений, что Windows плох для rails-разработчика. В основном это касалось проблем кодировок и прочей несовместимости. Все советовали либо Linux, либо Mac. Но так просто соскочить с Windows я не мог. Слишком много тут оставалось, чего не было там, поэтому решено было разобраться с виртуализацией.

Первым делом, конечно же, на ум пришло просто установить десктопную версию Linux (в качестве подопытной была выбрана… ubuntu) и работать с ней. Развернутая на весь экран гостевая ОС позволяла работать как с нативной. Но при этом терялась связь с Windows, не было никакой интеграции. Обмен файлами, что бы не заморачиваться с самбой или shared-folder в VirtualBox, был осуществлен через dropbox (спасибо вовремя подоспевшей версии 1.1 с selective sync). В общем, костыль на костыле.

Вторым этапом эволюции этого подхода было избавление от интерфейса и работа с Linux только через командную строку, а все редактирование кода перенести в Windows. В качестве подопытной был выбран серверный вариант той же убунты. Благо в таком варианте виртуальная машина в спокойном режиме потребляла от 45 мб памяти. На машине было настроено все rails-окружение. Поднят SSH сервер для доступа к командной строке. Сеть была настроена через bridged-adapter, благодаря чему я мог обращаться к ней по отдельному ip адресу, не заморачиваясь с port-forwarding. Для обмена файлами был выбран samba сервер, тогда я еще не задумывался, что VirtualBox может сама шарить папки между гостьей и хостом. Полное непонимание того, как устроена самба, омрачило все мое дальнейшее существование, пока в русской Google Group по Rails мне не указали на уже готовый рецепт.

Имя ему — Vagrant. Для самых нетерпеливых — вот минимум того, что позволит вам начать работать:

    $ gem install vagrant
    $ vagrant box add lucid32 http://files.vagrantup.com/lucid32.box
    $ vagrant init lucid32
    $ vagrant up

Для всех остальных чуть подробнее.

Vagrant



Vagrant позиционирует себя инструментом для виртуализации рабочего окружения. Все, что я написал выше в статье, он сделает за вас сам. Все, что вам нужно для его использования — это Ruby, Gems и VirtualBox (четвертой версии, если вы используете последнюю версию Vagrant).

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

Первым делом устанавливаете сам Vagrant. Он является простым gem-ом:

    $ gem install vagrant

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

Предустановленные ОС распространяются в так называемых боксах (box). В нашем случае это будет Ubuntu Lucid (10.04) 32-bit, которую автор проекта заботливо настроил и упаковал:

    $ vagrant box add lucid32 http://files.vagrantup.com/lucid32.box

Поддерживается как http протокол, так и напрямую с файловой системы. Данный урл у меня выкачивался с очень медленной скоростью, поэтому я решил его скачать burnbit торентом: burnbit.com/torrent/162482/lucid32_box

Следующим шагом будет инициализация выбранной директории (именно с этой директорией и пойдет вся дальнейшая работа). Для этого создайте директорию, которая впоследствии будет смонтирована и выполните

    $ vagrant init lucid32

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

В принципе система уже готова. Запустить ее можно используя 
    $ vagrant up 

Выбранная директория будет монтирована как «/vagrant». Все изменения будут автоматически синхронизированы. Подключиться к системе можно через SSH через vagrant@localhost и порт 2222. Логин и пароль на вход в систему — «vagrant: vagrant». Так же vagrant автоматически может создать вам файл настроек для Putty, если вы работаете из Windows:

    $ vagrant ssh

Port forwarding

Все хорошо, но только система открыта для внешнего мира одним SSH портом.

С помощью настроек vagrant можно заставить VirtualBox перенаправлять порты. Делается это через Vagrantfile. Для этого достаточно раскомментировать соответствующую строку:

config.vm.forward_port "http", 80, 8080


Что позволит общаться с 80 портом через 8080. Имя должно быть уникально, но особой роли для нас не играет. Таким образом, можно перенаправить любые порты. В случае rails вам, скорее всего, понадобится порт 3000:

config.vm.forward_port "rails", 3000, 3000


В принципе все готово. Хотя отдельного упоминания стоит интегрированная система provisioning.

Provisioning

Данная система позволяет декларативным способом устанавливать ПО в систему. Есть интеграция с Chef и Puppet.

Расскажу на примере Puppet и как установить с его помощью Apache.

В Puppet ПО ставится с помощью, так называемых модулей. Уже готовые модули можно взять на сайте puppetslab.com. Для начала нужно создать в нашей директории папку с модулями, обзовем ее, скажем, modules. Скачиваем модуль с апачем (http://forge.puppetlabs.com/puppetlabs/apache) распаковываем и содержимое кидаем в подпапку apache (важно, что бы внутри этой папки уже находилось содержимое модуля).

Для того, что бы сообщить Puppet об установке нужного модуля, нужно создать файл ./manifests/lucid32.pp Где «.» — это наша исходная папка. В ней пишем:

    include lucid32

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

Vagrant::Config.run do |config|
    config.vm.provision :puppet, :module_path => "modules"
end


где «modules» — это папка, с вашими модулями.

Теперь при следующем vagrant up система сконфигурирует Puppet и он установит apache. После полной загрузки системы, если вы установили перенаправление портов, можете увидеть ответ в браузере.

Заключение


Пусть вас не пугает то, что он использует Ruby, а сам, по сути, является джемом (gem). Он может стать удобным инструментом для любых разработчиков, кому нужно виртуализированное рабочее окружение. Он работает под разными платформами и может использовать разные гостевые ОС, все только в ваших руках.

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

Пример использования показывает только один сценарий использования. Он лишь решает мою проблему. Удобен он будет так же и командам разработчиков, позволяя стандартизировать рабочую среду, в которую входят библиотеки, сервера, БД и т.д. Группы разработчиков на разных платформах, единожды настроив, могут работать с одним окружением.


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.