Пользователь
0,0
рейтинг
10 февраля 2014 в 10:12

Разработка → Простая сборка виртуальных машин с помощью 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, он автоматически заполнит форму и вам останется только редактировать её.

Перевод первой части Build Virtual Machines Easily With PuPHPet.
Этот и другие переводы с сайта Sitepoint, а также прочие статьи о web-разработке.
Антон Кармазин @kriptomen
карма
39,0
рейтинг 0,0
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (18)

  • –3
    Предпочитаю всё же руками собирать. Хотя бы видишь что вообще происходит (либо не происходит, а должно и почему). Но это моё личное мнение.
    • +2
      Когда проектов много, не насобираешься :). Или когда нужно для всей команды проекта подготовить одинаковое окружение
      • +1
        Я на каждый проект подымаю виртуальный сервер разработки, и у всех одинаковое окружение :)
    • –5
      да я вобще не понимаю, зачем это нужно. у меня все на одном хосте, на одной настройке, вертится и нет никаких косяков. все ок.
    • +3
      К сожалению не осолил сборку руками. Да и не хочется очень уж углубляться в администрирование, оно конечно интересно, но если вникать во все смежные области — никакого времени не хватит.
      • +3
        С одной стороны, конечно, это задача сисадмина, с другой — умение поднимать самому окружение — это очень полезный опыт, плюс понимание того, как работать будет то, что ты пишешь, может сэкономить вам время при поиске узкого места, например. Лишним не будет. Не так уж много этих смежных областей. А если у вас *nix/Mac OS X — так и вовсе всё ставится несколькими строчками из репов/homebrew и правкой конфигов. Да и делается это, как правило, 1 раз.

        Хотя раздать всем готовое окружение, штука, конечно, полезная, тут не поспоришь.
    • +1
      Всем руками собираете? Новый сотрудник пришел — бросаете все дела, собираете ему. Появился новый сервер — снова бросаете все и настраиваете его?
      А работать когда?
      • +1
        Зачем же? 1 раз собрал. Всё. Дальше запускаем shell-скрипт — он собирает. А когда приходит новый сотрудник, то берёт документацию и сам собирает, что бы знал с чем и в чём работает. Не должно это занять более 20 минут.
  • +1
    Месяца два назад решил потестить PuPHPet но что то наверно пошло не так. Суть в том что все сборки были нерабочими, даже не знаю почему так произошло. По-этому пришлось остановится на голом вагранте
    • +1
      Как раз последние пару месяцев PuPHPet довольно активно обвновляется. Я как ни зайду, вижу, что добавилась та или иная опция. Так что рекомендую заглянуть туда еще раз. Но и «голый бродяга» (какой каламбур) отличная вещь.
    • +1
      Попробуйте vagrant + chef, можно самому сделать что нужно и работает отлично.
  • 0
    А одновременно MySQL и PostgreSQL через этот сервис сконфигурировать нельзя, как я понял? То есть выбор или или?
    • +1
      Как я понимаю, или или.
  • 0
    Попытка собрать образ Debian 7 x86, ожидаемо окончилась ручным допиливанием образа.
    • 0
      Почему ожидаемо? И что пришлось допиливать?
  • 0
    А как залогиниться на SSH?
    Я думал private key достаточно, сконвертировал его в формат Putty, но всё равно пароль спрашивается. А что за пароль?
    • 0
      А как вы заходите по ssh?

      vargant up — подтягивает образ, устанавливает, собирает, запускает его
      vagrant ssh — вход в машину. Без паролей, без ключей.
      • 0
        В Windows при выполнении этой команды выводится:

        d:\puphpet\>vagrant ssh `ssh` executable not found in any directories in the 
        %PATH% variable. Is an SSH client installed? Try installing Cygwin, MinGW or Git, all of 
        which contain an SSH client. Or use the PuTTY SSH client with the following authentication 
        information shown below:
        
        Host: 127.0.0.1
        Port: 2222
        Username: vagrant
        Private key: C:/Users/AccName/.vagrant.d/insecure_private_key


        В общем как обычно я протупил — нужно просто указать логин vagrant и сконвертированный (дя PuTTY) файл приватного ключа и всё логинится.

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