Перевод первой части Build Virtual Machines Easily With PuPHPet.
Создание и управление средами разработки расстраивает вас, замедляет работу или отвлекать вас от разработки? У вас возникают трудности из-за того, что ваше локальное окружение и окружение при деплое отличаются? Если это так, у меня есть для вас решение — PuPHPet!
Введение
Я не могу с уверенностью сказать за вас, но одна из моих любимых мозолей* в разработке — это окружение, будь то создание и поддержание его для различных проектов с различными потребностями, обеспечение взаимодействия команды разработчиков, (особенно, распределенной), или настройка сред для разработки, тестирования и боевого окружения. Все это может быть трудоемкой задачей, особенно когда выполняется вручную.
В зависимости от требований руководства или клиентов разнообразие вариантов выбора может вогнать в депрессию. Все они могут тянуть в разные стороны (и тянут!), зачастую одновременно.
Взять например варианты выбора базы данных MySQL, PostgreSQL, Oracle или SQLServer. А также NoSQL решения, таких как Cassandra, Hadoop, и Redis. Или выбор сервера, например Apache или Nginx. Список можно продолжать и продолжать. И когда рядом нет всегда готового помочь сисадмина (скажем фрилансер или очень небольшая команда разработчиков), время, затраченное на поддержание среды разработки значительно увеличивается, а мы превращаемся в DevOps*.
Чтобы наконец покончить с таким положением дел и сделать весь процесс как можно более эффективным, я приступил к изучению Vagrant и Puppet. Из бесед с коллегами и тщательному поиску на просторах интернета стало ясно, что эти два средства, фактически являются стандартом для создания повторно используемых сред. Если вы не знакомы с этими отличными инструментами, вот две краткие выдержки из их соответствующих руководств:
Vagrant:
Предназначен для создание и настройка легковесных, переносимых и портативные сред разработки. Vagrant будет изменяться в соответствии с вашими требованиями.
Puppet:
ПО, автоматизирующее управление инфраструктурой на протяжении его жизненного цикла, от резервирования и конфигурирования до настройки взаимодействия и отчетности. Используя Puppet вы можете легко автоматизировать повторяющиеся задачи, например, быстро развернуть критически важные приложения, и активно управлять изменениями, быстро масштабирование с 10 до 1000 серверов, на собственном оборудовании в облаке.
Однако, как и большинство людей в современном мире, я нетерпелив. Я знал, что должен быть способ, чтобы решать вышеобозначенные проблемы довольно быстро, но не становясь страстным поклонником.
Введение в PuPHPet
После дальнейшего гугления я наткнулся на PuPHPet, отличный инструмент с графическим интерфейсом, дающим простую возможность создания Puppet конфигурацию для Vagrant, которую можно тут же начать использовать.
Первоначально PuPHPet задумывался Juan Treminio как чертовски простое средство создания рабочего окружения для, преимущественно, PHP-разработчиков.
Он фокусируется на 5 направлениях:
- Развертывание (память, IP-адрес, проброс портов)
- Базовые настройки сервера
- PHP (модули, библиотеки, настройки конфигурации)
- База данных (PostgreSQL, MySQL)
- Веб-сервер (Apache 2, Nginx)
Если вам необходим PHP 5.5 в связке с PostgreSQL и Nginx или PHP 5.4 с Apache 2 и MySQL, вы можете быстро создать и загрузить необходимую конфигурацию.
С PuPHPet, окружения будет готово в течении получаса и все, что нужно сделать, это выполнить команду:
vagrant up
Вот так вот. В папке с разархивированным PuPHPet нужно использовать эту команду, немного подождать и готово. Не верите? Давайте вместе пошагово разберем весь процесс, от начала и до конца.
Когда мы закончим, я вас настойчиво прошу — не бойтесь изменять конфигурацию, менять опции, добавлять и убирать пакеты и все что сможете найти. Я уверен, вы будете впечатлены.
Необходимое ПО
Небольшое замечание, прежде чем мы начнем. Одна из самых больших проблем, с которыми я столкнулся, когда я впервые столкнулся c PuPHPet — проблемы с совместимостью право версий Vagrant и VirtualBox.
В настоящее время я использую Vagrant 1.3.5 и VirtualBox 4.3.2 и они работают безупречно. Для начала установить эти два пакета.
Создание конфигурации
Когда они будут установлены откройте puphpet.com. В самом верху предложены 4 варианта конфигурации: Local (т.е. на локальном компьютере), Digital Ocean, Rackspace и Amazon Web Services. Выберите Local, другие варианты мы сейчас рассматривать не будем.
В разделе «Local VM Details» мы можем выбрать следующие опции:
- Операционная система
- Имя хоста
- IP-адрес
- Объем оперативной памяти
Для нашего примера мы используем Debian Wheezy 7.2 x64 with VirtualBox 4.3 Это позволит нам использовать PHP 5.4 или 5.5. Оставшиеся 3 опции можно оставить как есть или изменить, если считаете нужным.
Далее раздел Local VM Forwarded Ports. Здесь я ничего не трогал, но если вы хотите, то можете настроить здесь проброс портов с локальной машины на виртуальную.
Совместное использование папок
Здесь Vagrant и Puppet начинают показывать всю свою мощь и гибкость. В Box Sync Folder Source нужно указать локальный каталог, который будет синхронизирован с каталогом в виртуальной машине, указанный в Box Sync Folder Target. Я оставил этот пункт по-умолчанию, также как и тип папок в Shared Folder Type.
Эта опция пригодится, если вы хотите создать несколько пользовательских каталогов в виртуальной машине. Скажем, у вас есть рабочая папка с проектом в ~/Documents/workspace/your-project. Вы можете отобразить этот каталог непосредственно в корне веб-сервера вашей виртуальной машины. Таким образом, вы можете разрабатывать локально, без синхронизации или необходимости ручного копирования в рабочую папку проекта в виртуальной машине.
Базовые настройки сервера
Если вам для работы необходимы конкретные пакеты, такие как Git, subversion, Vim, и т.д., то их необходимо перечислять в этом разделе. Единственное, что следует помнить, — имя пакета должно быть указано также, как и в выбранной операционной системе.
Веб-сервер
Apache или Nginx? Сейчас я выберу Apache. Затем необходимо указать модули, которые будут установлены и включены, введя в поле Apache Modules. Чтобы облегчить процесс ввода названий модулей, а также избежать ошибок, поле ввода будет представлено всплывающим списком доступных вариантов.
Далее идет конфигурация Virtual Host. В полях имя сервера и псевдоним указывается необходимое доменное имя. Для того, чтобы это настройка сработала, в файле hosts локального компьютера нужно добавить запись данного домена с соответствующим ip. В поле Document Root стоит указать ту же директорию, что и в Box Sync Folder Target, чтобы сделать синхронизацию простой и красивой. Если у вас нет особой необходимости, оставьте в поле Port 80, т.е. по-умолчанию.
Оставшиеся две настройки, Environment Variables и AllowOverride изменить, только если ваше приложение нуждается в этом. (Прим. пер. — не совсем понял назначение этих двух опции, кто в курсе — проясните пожалуйста).
PHP
Здесь не так много опций, но основные, как раз те, что нужны чаще всего — присутствуют. Я оставил по-умолчанию PHP 5.5 (я думаю, сейчас уже вряд ли стоит смотреть на версии ниже этой). Я также отметил установку Composer. Если вы не использовали Composer, или не уверены нужен ли он вам, советую познакомиться с ним поближе, он стоит того.
В разделе INI Settings, я оставил уже выбранные опции, а затем добавил allow_url_fopen, allow_url_include, error_log, file_uploads и apc.enabled. Не стесняйтесь сделать то же самое, или просмотреть и выбрать из обширного списка.
Я изменил PHP Timezone на Europe/Berlin как наиболее близкий к моему местоположению. Советую поступить также, и выбрать нужный вам часовой пояс. В PHP Modules я остановился на таком списке: cli, intl, mcrypt, cgi, curl, memcached, memcache, pspell, tidy и sqlite. Просмотрите список и добавить те, которые вам нужны. Для модулей PEAR и Pecl я оставил все как было.
Я выбрал установку Xdebug (по-умолчанию) но не Xhprof. Настоятельно рекомендую использовать XDebug и вам.
База данных
Так, теперь внимательно. Для нашего примера я выбрал MySQL, установил пароль для root и оставили привилегии для всех. Название БД SitePoint, имя пользователя TestUser и пароль testpassword. У меня нет установочного SQL файла в данном примере, поэтому оставлю последнее поле пустым.
Создание и загрузка конфигурации
Теперь, просто нажмите большую кнопку Go ahead then, make it. Вы увидите, что загрузку началась. После её окончания, распакуйте архив и перейдите в каталог в вашем терминале. Оттуда, запустите vagrant up.
Начинается процесс создания виртуальной машины. Если вы не загружали ранее файл Box (образ ОС), который указан при создании конфигурации, вам придется ждать немного дольше, сначала будет произведена загрузка образа и только после этого начнется создание виртуальной машины. Если все пройдет нормально, вы увидите следующий вывод:
vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'debian-wheezy72-x64-vbox43'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Running 'pre-boot' VM customizations...
[default] Booting VM...
[default] Waiting for machine to boot. This may take a few minutes...
[default] Machine booted and ready!
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant
[default] -- /var/www
[default] -- /tmp/vagrant-puppet/manifests
[default] Running provisioner: shell...
[default] Running: /var/folders/_w/k6fxbl615w700lgkrtt0vb3w0000gn/T/vagrant-shell20131126-3538-kid3ga
stdin: is not a tty
____ ____ _ _ ____ _ generated using
| _ _ _| _ | | | | _ ___| |_ ___ ___ _ __ ___
| |_) | | | | |_) | |_| | |_) / _ __| / __/ _ | '_ ` _
| __/| |_| | __/| _ | __/ __/ |_ | (_| (_) | | | | | |
|_| __,_|_| |_| |_|_| ___|__(_)______/|_| |_| |_|
Created directory /.puphpet-stuff
Running initial-setup apt-get update
Finished running initial-setup apt-get update
[default] Running provisioner: shell...
[default] Running: /var/folders/_w/k6fxbl615w700lgkrtt0vb3w0000gn/T/vagrant-shell20131126-3538-1116fzj
stdin: is not a tty
Downloading http://apt.puppetlabs.com/puppetlabs-release-wheezy.deb
Finished downloading http://apt.puppetlabs.com/puppetlabs-release-wheezy.deb
Running update-puppet apt-get update
Finished running update-puppet apt-get update
Updating Puppet to latest version
dpkg-preconfigure: unable to re-open stdin: No such file or directory
Finished updating puppet to latest version: Puppet v3.3.2
Created empty file /.puphpet-stuff/update-puppet
...
Info: Creating state file /var/lib/puppet/state/state.yaml
Notice: Finished catalog run in 436.21 seconds
Проверьте работоспособность
Теперь, когда виртуальная машина создана, залогиньтесь в ней. Чтобы сделать это, в том же каталоге запустите vagrant ssh. После входа, чтобы быстро проверить, что все работает запустите sudo netstat -tlnp. Вывод покажет, какие службы работают. Он должен соответствовать этому:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1643/rpcbind
tcp 0 0 0.0.0.0:39284 0.0.0.0:* LISTEN 1678/rpc.statd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2643/sshd
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 13637/postgres
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2399/exim4
tcp6 0 0 :::111 :::* LISTEN 1643/rpcbind
tcp6 0 0 :::80 :::* LISTEN 31623/apache2
tcp6 0 0 :::22 :::* LISTEN 2643/sshd
tcp6 0 0 ::1:5432 :::* LISTEN 13637/postgres
tcp6 0 0 ::1:25 :::* LISTEN 2399/exim4
tcp6 0 0 :::37887 :::* LISTEN 1678/rpc.statd
Там вы увидите, что Apache и PostgreSQL (Прим. пер.: хотя в конфигурации было MySql) работает. Если вы посмотрите в /etc/apache2/sites-enabled/ вы увидите конфигурацию для вашего виртуального хоста.
Все готово!
Заполняя в первый раз, может показаться, что шагов слишком много. Но теперь, когда мы прошли этот путь вместе, все получится намного быстрее. Более того, вам не нужно создавать конфигурацию каждый раз с нуля.
Если вы перетащите puppet/hieradata/common.yaml на puphpet.com, он автоматически заполнит форму и вам останется только редактировать её.
Автор: kriptomen