Рабочее окружение

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

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

Идеальное рабочее окружение соответствует боевой среде (той, куда вы деплоитесь), это не всегда возможно, но на то оно и идеальное. Первое, чего необходимо добиться, это изоляция окружения от всего, что не связано с самим проектом. Решается это виртуализацией. Стандартный подход на рабочих машинах - это использование программной виртуализации, при которой специальное программное обеспечение создает и запускает гостевую операционную систему внутри хост-системы, например, Virtualbox. Выглядит этот как обычная программа, то есть отдельное окно, внутри которого запущена полноценная операционная система.

Это настолько распространенный вариант и задача, что появился на свет такой инструмент как Vagrant. По сути, vagrant - это утилита командной строки, которая упрощает управление виртуальными машинами для разработки. То есть сама она не занимается виртуализацией, а требует наличия в системе одного из поддерживаемых средств виртуализации. К ним относятся VirtualBox, Parallels Desktop, VMware Workstation, Docker и даже облачные провайдеры, такие как Amazon EC2. Подход, который предлагает Vagrant, это "виртуальная машина на проект", что правильно, потому что у каждого проекта свое окружение.

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

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

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

Чтобы начать работу с Vagrant, сначала необходимо скачать и установить одну из систем виртуализации, например, VirtualBox. Дальше нужно установить сам Vagrant. Установщик можно найти на этой странице https://www.vagrantup.com/downloads.html.

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

$ vagrant init ubuntu/trusty64

Эта команда создаст файл Vagrantfile в директории запуска. Vagrantfile это ruby-скрипт, в котором описывается конфигурация Вагранта. Внутри множество комментариев показывающих то, как можно конфигурировать Вагрант и виртуальную машину. Единственная активированная конфигурация - это указанный box, который будет использоваться. В нашем случае это ubuntu/trusty64.

Следующая команда запускает виртуальную машину и проводит базовую конфигурацию.

$ vagrant up

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

$ vagrant ssh

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

Еще одной крайне полезной функцией вагранта является проброс портов. Пример:

Vagrant.configure("2") do |config|
  config.vm.network "forwarded_port", guest: 80, host: 8080
end

Теперь все, что запущено на гостевой операционной системе на порту 80, доступно на хост системе на порту 8080. Можно добавить сколько угодно таких пробросов.

Кроме этого, у вагранта есть полезная функциональность под названием Provisioning. Она позволяет интегрироваться с большим количеством систем для управления конфигурацией. Для настройки операционной системы с помощью Ansible достаточно выполнить следующие шаги:

  1. Написать плейбук.
  2. Включить provisioning.

    config.vm.provision "ansible_local" do |ansible|
     ansible.playbook = "playbook.yml" // Путь относительно директории с проектом
    end
    
  3. Выполнить снаружи команду vagrant provision.

Типичные кейсы при использовании вагранта

Что-то пошло не так. Нужно все пересобрать.
$ vagrant destroy
$ vagrant up
Проброс ключей
config.ssh.forward_agent = true

Fork me on GitHub