Вам понадобится знать всего пару вещей о Vagrant и Puppet для понимания этой статьи. Vagrant создает виртуальные машины используя какой-либо провайдер (в нашем случае VirtualBox). Vagrant запускает Puppet на созданной виртуальной машине и Puppet установит на нее необходимый софт (Apache, MySQL и т.д.). Этот процесс называют развертыванием.
Зачем использовать Vagrant?
Когда мы используем Vagrant для создания виртуальной машины, то избавляем себя от опасности испортить нашу "персональную" виртуальную машину. Люди использовали виртуальные машины для разработки многие годы. Но у них полно недостатков: неудобно пробрасывать внутрь USB устройства, без сложной и длительной настройки синхронизации папок приходилось использовать IDE или текстовый редактор прямо из ВМ. Это пожирало ресурсы вашей реальной машины. Поддержание одинаковой версии ПО на ВМ среду команды было просто адской болью для разработчиков. Почему бы просто не скопировать Vagrantfile и пару манифестов для Puppet вместо всего этого? Вместо передачи гигабайт образов ВМ просто закинуть настройки Vagrant и Puppet в вашу систему контроля версий.
Далее мы так и поступим, развернув окружение для Symfony2 на виртуальной машине.
Давайте позволим Composer сделать за нас всю работу по созданию нового проекта:
curl -s https://getcomposer.org/installer | php
php composer.phar create-project symfony/framework-standard-edition symfony2 'dev-master'
cd symfony2
После установки вы должны увидеть что-то вроде “Some parameters are missing. Please provide them.”.
На вопрос “Would you like to install Acme demo bundle? [y/N]” отвечайте Y, чтобы было что посмотреть ради примера.
Идем дальше. На вопрос про настройки просто жмите Enter, оставляя все настройки по умолчанию.
Мы запускаем дев-окружение, поэтому давайте изменм пару строк в .htaccess файле. Замените строки о app_dev.php на это:
# /web/.htaccess
RewriteRule ^app_dev.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]
RewriteRule .? %{ENV:BASE}/app_dev.php [L]
А так же немного поправьте app_dev.php, чтобы он не ругался 403-й ошибкой об ограничении доступа. Закоментируйте эти строки:
# /web/app_dev.php
// header('HTTP/1.0 403 Forbidden');
// exit('You are not allowed to access this file. Check '.basename(FILE).' for more information.');
У нас есть Symfony2 проект, но мы не сможем на нем разрабатывать без веб-сервера. Давайте переложим на Vagrant всю эту "тяжелую" работу по установке.
Vagrant имеет кучу возможностей прямо из коробки, и не так уж сложно его настроить. Установите последнюю версию, откройте терминал в директории проекта:
vagrant init hashicorp/precise32
Теперь откройте создавшийся Vagrantfile в любом текстовом редакторе и давайте настроим развертывание через Puppet, а так же прокинем 8080 порт на 80 в виртуальной машине. На этом настройка Vagrant завершится.
# /Vagrantfile
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "hashicorp/precise32"
config.vm.network "forwarded_port", guest: 80, host: 8080
# Enable provisioning with Puppet stand alone. Puppet manifests
# are contained in a directory path relative to this Vagrantfile.
# You will need to create the manifests directory and a manifest in
# the file default.pp in the manifests_path directory.
#
config.vm.provision "puppet" do |puppet|
puppet.manifests_path = "manifests"
puppet.manifest_file = "site.pp"
end
end
В действительности....Symfony2 потрясающий и мощный фреймворк, но с высоким порогом вхождения. Чтобы избавиться от ручной работы и запустить Symfony приложение нам понадобятся три вещи:
Puppet скрипт будет довольно простым, все что нам нужно это установить на ВМ Apache, PHP, mod_rewrite и MySQL. Создайте папку manifests в вашем проекте и внутри файл sites.pp с таким содержимым:
# /manifests/site.pp
exec {"apt-get update":
path => "/usr/bin",
}
package {"apache2":
ensure => present,
require => Exec["apt-get update"],
}
service { "apache2":
ensure => "running",
require => Package["apache2"]
}
package {['mysql-server', 'mysql-client']:
ensure => installed,
require => Exec["apt-get update"]
}
service { 'mysql':
ensure => running,
require => Package['mysql-server'],
}
package { ["php5-common", "libapache2-mod-php5", "php5-cli", "php-apc", "php5-mysql"]:
ensure => installed,
notify => Service["apache2"],
require => [Exec["apt-get update"], Package['mysql-client'], Package['apache2']],
}
exec { "/usr/sbin/a2enmod rewrite" :
unless => "/bin/readlink -e /etc/apache2/mods-enabled/rewrite.load",
notify => Service[apache2],
require => Package['apache2']
}
Для начала создадим символьную ссылку внутри ВМ на /var/www из нашей /vagrant директории:
# /manifests/site.pp
file {"/var/www":
ensure => "link",
target => "/vagrant",
require => Package["apache2"],
notify => Service["apache2"],
replace => yes,
force => true,
}
А теперь давайте настроим простой vhost указывающий на нашу папку web в Symfony проекте. Эта настройка так же должна оказаться в нашем git-репозитории. Создадим файл vhost.conf в папку manifests/assets с таким содержимым:
# /manifests/assets/vhost.conf
<VirtualHost *:80>
ServerName symfony.dev
DocumentRoot /vagrant/web
<Directory /vagrant/web>
# enable the .htaccess rewrites
AllowOverride All
Order allow,deny
Allow from All
</Directory>
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined
</VirtualHost>
А теперь укажем Puppet создать символьную ссылку на этот файл в sites-available Apache:
# /manifests/site.pp
file { "/etc/apache2/sites-available/default":
ensure => "link",
target => "/vagrant/manifests/assets/vhost.conf",
require => Package["apache2"],
notify => Service["apache2"],
replace => yes,
force => true,
}
Это дев-окружение, так что можно позволить себе небольшой хак чтобы не возится с правами на папки. Хак честно стащен у Jeremy Kendall. Все что нужно, это заставить Apache использовать пользователя и группу Vagrant, это позволит писать в кеш и логи без каких-либо проблем.
# /manifests/site.pp
exec { "ApacheUserChange" :
command => "/bin/sed -i 's/APACHE_RUN_USER=www-data/APACHE_RUN_USER=vagrant/' /etc/apache2/envvars",
onlyif => "/bin/grep -c 'APACHE_RUN_USER=www-data' /etc/apache2/envvars",
require => Package["apache2"],
notify => Service["apache2"],
}
exec { "ApacheGroupChange" :
command => "/bin/sed -i 's/APACHE_RUN_GROUP=www-data/APACHE_RUN_GROUP=vagrant/' /etc/apache2/envvars",
onlyif => "/bin/grep -c 'APACHE_RUN_GROUP=www-data' /etc/apache2/envvars",
require => Package["apache2"],
notify => Service["apache2"],
}
exec { "apache_lockfile_permissions" :
command => "/bin/chown -R vagrant:www-data /var/lock/apache2",
require => Package["apache2"],
notify => Service["apache2"],
}
Теперь запускам vagrant up из директории проекта и наблюдаем как оживает наше Symfony2 приложение. Перейдите на http://127.0.0.1:8080 чтобы увидеть первую страницу приложения.
Теперь у нас есть рабочий Symfony2 проект, живущий на виртуальной машине. Мы можем начать разработку незамедлительно. Чтобы увидеть реальные преимущества использования Vagrant и Puppet вы можете скопировать проект на другой компьютер, запустить composer install и vagrant up и проект запустится без лишних вопросов и настроек. Вы можете заниматься разработкой даже под разным ОС, в том числе OSX, Windows или Linux.
Исходный код урока можно посмотреть тут: https://github.com/nater1067/Vagrant-Symfony-2
Все что написано выше опробовано буквально вчера и отлично работает. Конено, конфиг довольно примитивный и топорный, но тем не менее полностью рабочий.
В статье все команды запускаются из терминала, но я использовал PhpStorm для запуска Vagrant. Из меню Tools -> Vagrant можно делать все без консоли и довольно удобно.
Это очень вольный перевод, так что не придирайтесь к непереведенным словам. Весь смысл сохранен очень хорошо, а где-то даже лучше.