Vagrant — единое окружение для разработки

Преамбула

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

В современном мире WEB-разработки, разработчики уже давно перестали устанавливать окружение для разработки: PHP, WEB-сервер, СУБД и т.д. на свой локальный компьютер, на котором производят разработку.

Во-первых, установка и настройка занимает драгоценное время и силы.

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

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

В четвертых, состояние окружения вашего рабочего компьютера скорее всего не совпадает и не может совпадать с состоянием окружения вашего боевого (продакшн) сервера. Ведь у вас же Windows со всеми его причудами в конфигурировании, а на боевом сервере что-то однозначно другое.

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

Избежать этого хаоса вам поможет виртуализация окружения разработки. Вам нужна виртуальная машина, которая бы разворачивалась по заданному вами сценарию, чтобы ее можно было развернуть одним кликом на любом компьютере под любой операционной системой. Пока вы будете пить кофе, ваша виртуальная машина будет готова. Также вам нужны какие-то средства для быстрого и простого управления такой виртуальной машиной (запуск, остановка, реконфигурация). И еще было бы здорово, если бы в файловой системе этой виртуальной машины был каталог, который отображался с каталога вашей локальной машины. Например, чтобы каталог локальной машины D:\myProjects, где хранятся ваши проекты, соответствовал каталогу виртуальной машины /var/myProjects или подобному. Еще хотелось бы иметь возможность выполнять настоящую отладку с использованием PHP-xDebug, причем приложение должно выполняться в виртуальной среде, на виртуальной машине, а управлять им вы могли с локальной. Уже нравится? Идем дальше!

Vagrant

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

Скажу лишь несколько слов. Vagrant — это надстройка над гипервизорами (виртуальными машинами), такими как vmWare, VirtualBox, Parallels и другими. Для Vagrant существуют готовые образы операционных систем, называемых «коробками» (boxes). Часто авторы коробок собирают их для поддержки в разных гипервизорах. Мне по душе гипервизор VirtualBox, потому что я начал работать с Vagrant еще тогда, когда поддерживался только он, да и до сих пор больше всего коробок выпускаются именно под VirtualBox. Сейчас же вы можете выбрать гипервизор на свой вкус, главное, чтобы он поддерживался той коробкой, которую вы собираетесь использовать.

Использование Vagrant решает проблему идентичности состояния окружения разработки, не зависимо от операционной системы на хост-машине (так называется ваш локальный компьютер). Гостевая операционная система, выполняемая на виртуальной машине, всегда будет одна и также. К сожалению, Vagrant рассчитан только на обеспечения идентичности состояния при разработке. На сервер невозможно установить Vagrant (точнее, конечно, возможно, но лучше этого не делать), так как виртуализация с использованием Vagrant работает на уровне виртуальной машины, что, очевидно, не подходит для продакшена. Оставлю здесь для себя и для вас небольшую ремарку: о том, как добиться идентичности состояния при разработке и в продакшене я (когда нибудь) напишу отдельную статью про Docker.

Чтобы развернуть коробку в виртуальную машину, нужен файл конфигурации, в котором описаны все параметры развертывания. Такой файл называется Vagrantfile и написан он с применением синтаксиса Ruby (на котором и написан Vagrant). Я не стану заставлять вас писать такой файл вручную. Чаще всего вы можете найти уже готовый файл в описании установки вашей коробки, в который нужно внести руками лишь некоторые изменения. Но все это индивидуально для каждой коробке. В любом случае Вы найдете инструкции по развертыванию виртуальной машины на ее основе в инструкциях к ней. На всякий случай еще раз повторю ссылку на хранилище коробок.

Как установить и попробовать

Устанавливаем

Для начала вам необходимо установить гипервизор и затем установить сам Vagrant. Чтобы виртуальные машины могли выполняться, необходимо, чтобы ваш процессор поддерживал виртуализацию и она была обязательно включена в BIOS.

Давайте для начала, чтобы уж точно всё получилось, остановимся на гипервизоре VirtualBox. Это замечательный бесплатный гипервизор от Oracle, который очень быстро и просто устанавливается и сразу же работает без танцев с бубном.

Перед тем как начать установку, убедитесь, что путь к вашей домашней папки, а также путь к файлам ваших проектов не содержат кириллических символов. Если всё же кириллические символы есть, то нужно создать два каталога, например D:\VagrantHome и D:\VirtualBoxMachines. В первом будут находиться файлы Vagrant, а во втором файлы виртуальных машин VirtualBox. Теперь создайте переменную окружения с именем VAGRANT_HOME и значением D:\VagrantHome. Перезагрузитесь.

Теперь можно скачать и установить VirtualBox. После установки откройте окно приложения и перейдите в Файл—Настройки—Общие. Если вы создавали каталог, подобный D:\VirtualBoxMachines, то укажите путь к нему здесь, где «Папка для машин по умолчанию». После этого окно приложения можно закрыть.

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

Последнее, что пригодится — это git. Это клиент, необходимый для работы с системой контроля версий git. Если вы еще не знакомы с этим, обязательно ознакомьтесь, зачем это и для чего. Вам понравится.

Во время установки будьте осторожны. Раз уж мы с вами разрабатываем на PHP, то наши файлы не зависимо от операционной системы должны иметь окончания строк вида \n или LF. Это значит, что нам не нужно автоматически преобразовывать концы строк в файлах нашего исходного кода. Поэтому во время установки git, когда будет предложено выбрать, как обрабатывать окончания строк на экране установки «Configuring the line ending conversions», выбирайте второй вариант «Checkout as-is, commit Unix-style line endings.» и git не будет изменять окончания строк в \r\n, как это принято для разработки в других языках программирования.

Описанные процедуры были больше для Windows, однако вы можете точно так же установить VirtualBox и Vagrant в других операционных системах. Смысл тот же.

Разбираемся в коробках

Вы можете воспользоваться различными коробками, например, поставляемыми с фреймворками или рекомендуемыми к использованию ими же.

Одна виртуальная машина на один проект

Если Вы разрабатываете (или только хоттите начать разрабатывать) на фреймворке Yii2, то шаблоны приложений (базовый и расширенный) уже содержат файл конфигурации Vagrantfile, который использует коробку bento/ubuntu-16.04. Вся конфигурация: развертывание (provision), конфигурация nginx и конфигурация самой виртуальной машины описаны в различных файлах, находящихся в каталоге vagrant в корне приложения.

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

В файле Vagrantfile вы найдете параметр config.vm.synced_folder, который указывает каталоги для отображения (синхронизации). В данном случае, текущий каталог хост-машины (вашего компьютера) отображается на каталог /app на виртуальной. Все файлы, которые находятся у вас в текущем каталоге, также незамедлительно доступны на виртуальной машине в каталоге /app.

Если в Вашем проекте появляется необходимость в использовании нового расширения PHP, либо в какой-то другой зависимости, то вам достаточно добавить ее в файл vagrant/provision/once-as-root.sh, который представляет собой сценарий установки и настройки виртуальной машины. Как только Вы это сделаете и отправите измененный файл в репозиторий — ваши коллеги получат все эти изменения и введя всего одну команду перенастроят свои виртуальные машины. Таким образом вам не придется рассказывать и запоминать что куда установить и как настроить — все сохранено в сценариях автоматического развертывания виртуальной машины.

Одна виртуальная машина на все проекты

Еще один способ использования виртуализации — использовать одну виртуальную машину для всех ваших проектов. Именно такой подход применен в отдельной виртуальной машине от авторов Laravel, которая называется Homestead. Стоит отметить, что Homestead также может быть развернута в качестве виртуальной машины для одного проекта, подобно описанному выше варианту, но мы ниже рассмотрим именно вариант использования одной машины для всех проектов. Как запустить Homestead для одного проекта, читайте в документации.

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

Чтобы воспользоваться данной коробкой, вам необходимо загрузить файлы из репозитория и создать пару RSA-ключей (открытый и закрытый). Как это сделать описано здесь.

Работу именно с Homestead мы рассмотрим далее как пример.

Другие

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

Пробуем

Итак. VirtualBox и Vagrant у нас установлены. Теперь пришло время начать их использовать. Мы договорились, что будем использовать коробку Laravel/Homestead. Инструкция по ее развертыванию доступна здесь. Ознакомьтесь обязательно с ней, так как она может содержать более актуальную информацию. Я же дальше опишу простые шаги.

Еще раз договоримся, что все наши проекты красиво лежат в каталоге D:\myProjects, разложенные по папочкам. Именно на этот каталог мы будем опираться далее. Вы же должны заменить его на свой.

Далее необходимо будет вводить команды в командную строку. Однако, я рекомендую использовать вместо привычной командной строки интерпретатор git-bash, который идет в комплекте с git под Windows. Запустите его и перейдите в каталог с проектами, выполнив команду

cd /D/myProjects

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

vagrant box add laravel/homestead
git clone https://github.com/laravel/homestead.git Homestead

Итак, коробка загружена, конфигурация тоже. Теперь необходимо запустить инициализацию этой конфигурации (скрипт просто скопирует файлы на свои места). Затем установим плагин, позволяющий автоматически управлять host-файлом на вашей локальной машине. Выполните (В примере указана ветка с версией 7.0.1 — актуальной на момент написания статьи. Вам же нужна самая последняя ветка):

cd Homestead
git checkout v7.0.1
./init.sh
vagrant plugin install vagrant-hostmanager

После этого в вашем домашнем каталоге должен появиться каталог .homestead, содержащий файл Homestead.yaml — это конфигурационный файл в формате YAML, который вы должны открыть любым редактором кода и отредактировать. Давайте посмотрим, что там внутри. Я покажу уже отредактированный файл, который использую я в тестовой конфигурации. Вы же можете обратиться к документации по конфигурированию Homestead для более подробной информации.

---
ip: "192.168.22.2"
memory: 2048
cpus: 2
provider: virtualbox

folders:
  - map: d:\myProjects
    to: /home/vagrant/www

sites:
  - map: hmvc.app
    to: /home/vagrant/www/hmvc/public
  - map: yiibasic.app
    to: /home/vagrant/www/yii2basic/web

databases:
  - homestead

Здесь видно, что IP адрес виртуальной машины 192.168.22.2, ей выделено 2 Гб ОЗУ и 2 ядра процессора. Провайдер (гипервизор) — VirtualBox.

Далее следует список каталогов локальной системы folders, отображаемых на каталоги виртуальной машины. У меня такой один — каталог d:\myProjects (указан в директиве map) отображается на каталог /home/vagrant/www (указан в директиве to) внутри виртуальной машины. То есть все файлы и каталоги внутри него будут автоматически доступны внутри виртуальной машины по указанному пути.

Далее список сайтов sites. Указывается URL сайта в директиве map, а также путь к корневому каталогу этого сайта внутри виртуальной машины в директиве to.

В самом низу примера — базы данных databases. Я использую одну базу данных с именем homestead.

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

После того, как конфигурационный файл составлен, просто запускаем виртуальную машину. Возвращаемся в интерпретатор git-bash и, находясь в каталоге /D/myProjects/Homestead выполняем команду vagrant up.

Первый запуск этой команды приведет к развертыванию виртуальной машины из коробки и конфигурированию ее согласно файлам конфигурации. Чтобы остановить виртуальную машину, находясь в каталоге /D/myProjects/Homestead, выполните vagrant halt. Последующие запуски виртуальной машины будут происходить значительно быстрее, так как уже будет готовый образ виртуальной машины, развернутый из коробки и настроенный.

Если вы что либо меняете в файле конфигурации, то достаточно запустить развертывание принудительно, выполнив команду vagrant provision. Все изменения в конфигурации будут применены к текущей виртуальной машине.

Homestead позволяет легко производить конфигурирование сайтов, добавлять задачи в планировщик, выполнять проброс портов и много чего еще. Чтобы узнать об этом подробней, обратитесь к официальной документации.

Глобальный доступ для управления Homestead

Так как описанный способ использования виртуальной машины Homestead подразумевает глобальную установку для использования всеми проектами на локальной машине, то хотелось бы иметь возможность управления данной виртуальной машиной не из каталога d:\myProjects\Homestead, а из любого места.

Это очень легко настроить. Обратитесь к данному пункту документации, чтобы узнать как это сделать для разных операционных систем.

Заключение

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

Разница в потребляемых ресурсах виртуальной машины и того варианта, если бы вы развернули окружение локально в Windows, стремится к нулю. Удобство от использования виртуальной машины стремится к максимуму. Дополнительным опытом при использовании такого способа разработки будет пассивное изучение нормальных операционных систем, вроде Debian или Ubuntu.

Манипуляции с виртуальными машинами производятся либо через командную строку, либо через нажимание кнопочек в IDE PhpStorm (в меню Tools-Vagrant). Основные команды управления:

vagrant up — запускает виртуальную машину. Если виртуальная машина еще не построена, то сначала строит ее (при необходимости скачивает образ коробки).

vagrant halt — останавливает виртуальную машину.

vagrant reload — перезагружает виртуальную машину.

vagrant ssh — открывает ssh соединение с виртуальной машиной.

vagrant provision — производит перепостроение виртуальной машины (например, если изменили файлы конфигурации).

Остальные команды можно узнать введя vagrant help.

Удачного использования!

Vagrant — единое окружение для разработки: 18 комментариев

  1. Здравствуйте.

    Извиняюсь за наивный вопрос: как правильно устанавливать в Homestead всякие прикладные штуки типа Symfony, VueJS и т.п.?

    Я имею в виду, можно ли их ставить в хост-системе Windows указав папку с проектом, или лучше в самой виртуальной машине через ssh-консоль?

    1. Добрый день.
      Можно и так и так. Но из под windows это крайне неудобно делать, к тому же, придется устанавливать и настраивать все эти утилиты.
      В Homestead уже есть все необходимые инструменты, так что под Windows вообще ничего не придется устанавливать дополнительного.
      Так что самый верный и самый удобный способ будет использовать ssh-консоль с Homestead и там уже локально под настоящим линуксом использовать утилиты вроде composer, git, npm, yarn и другие.

  2. У меня есть боевой VPS сервер LAMP на Debian8 c массой разных надстроек, почтой, тестами и т. д на 25GB. Как скопировать его в виртуальную машину для разработки?

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

  3. Добрый день.
    Подскажите, а можно одну систему «Vagrant Laravel Homestead» установить на несколько компьютер так, что бы оно потом синхронизировалось через Dropbox.

    1. Добрый день. А какой в этом смысл? Вы можете синхронизировать файл Homestead.yaml, чтобы на двух разных компьютерах иметь одинаковые настройки в Homestead. Если понадобится, измените файл, а потом через дропбокс передадите его на остальные компьютеры. Можете развернуть репозиторий Homestead прямо в дропбокс. Все зависит от того, какова ваша цель.

      1. А как быть с данными внутри виртуальки? Меня интересует данные Mysql базы? Как эти данные синхронизировать на трех машинах автоматически без бекапов …

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

      2. Как то странно. Вроде отвечал на ваш вопрос, а коммента нет. Ну да ладно. Как быть с базой Mysql и данными которые было установлены в систему? Например phpmyadmin? Я нашел уже некоторые причины генераций нового образа на другой машины. Но меня удивляет что нельзя автоматизировать процесс, или я просто не знаю как ?!

        1. Про содержимое баз данных уже сказал — используйте миграции и фикстуры (seeds), а не выполняйте создание схемы и заполнение данными вручную. В противном случае синхронизировать можно только через backup — restore.

          Что касается настроек виртуальной машины, то вы можете использовать Homestead в другом режиме, когда он работает не отдельно, а внедрен в ваш проект и файлы конфигурации Homestead также как и остальные файлы проекта попадают в репозиториий. Тогда все настройки виртуальной машины будут в вашем репозитории и при их изменении нужно будет просто выполнить vagrant provision.

          Можно использовать тот же Homestead, но внутри проекта: https://laravel.com/docs/5.6/homestead#per-project-installation
          Или же попробовать экспортировать настройки из standalone Homestead: https://laravel.com/docs/5.6/homestead#sharing-your-environment

  4. «Чтобы воспользоваться данной коробкой, вам необходимо загрузить файлы из репозитория и создать пару RSA-ключей (открытый и закрытый).»
    Вот этот момент можно было по подробней. Для начинающих не ясно совсем что нужно сделать.

    1. Тема аутентификации при помощи RSA-ключей выходит за рамки вопроса о Vagrant, так как относится к SSH, поэтому и не описана в данной статье.
      В Homestead используется пара RSA-ключей для аутентификации по протоколу SSH.
      Сгенерировать пару RSA-ключей в Windows можно несколькими способами.

      Наиболее простой. Если у вас установлен Git, воспользоваться его интерпретатором bash (Git Bash). Откройте Git Bash и выполните там команду ssh-keygen. Вам будут заданы вопросы: путь для сохранения ключей — оставьте его таким, как предложено, а также пароль — можете оставить его пустым, если не планируете использовать эту пару ключей для чего-то более серьезного, чем аутентификация в Homestead.
      В результате будет сгенерирована пара ключей: закрытый id_rsa (секретный, который никому никогда нельзя передавать) и открытый id_rsa.pub (публичный, который вы теоретически можете распространять). Оба ключа будут находиться в подкаталоге .ssh вашего домашнего каталога пользователя (его вы видели при запуске утилиты ssh-keygen).

      Если же у вас нет Git Bash, вы можете скачать утилиту puttygen.exe отсюда из раздела Alternative binary files. Запустите ее, убедитесь, что выбран тип ключа RSA и нажмите Generate. После того, как ключи сгенерированы, вы можете сохранить их, нажимая соответствующие кнопки в окне утилиты. Вам нужно сохранить оба ключа в отдельности. Лучше сохранять их в подкаталог .ssh вашего домашнего каталога с именем id_rsa.pub для публичного ключа и id_rsa для секретного (при сохранении секретного ключа по умолчанию предлагается сохранить его в формате ppk — вы должны переключиться на All files).

Прокомментировать