При использовании PuPHPet для настройки Vagrant мне не нравится что все сайты которые хочется добавить необходимо перечислить. С одной стороны это хорошо, а с другой не очень - например у меня десяток сайтов с одинаковыми настройками.
Что бы облегчить себе жизнь я решил автоматизировать процесс добавления сайтов.
В качестве сайтов будут добавляться папки из синхронизируемой папки. Т.е. все те папки что попадут в /var/www/
Для того что бы всё это работало необходимо:
1. установить модуль vagrant-hostmanager (его и так необходимо устанавливать при использовании PuPHPet, для того что бы хосты пробрасывались)
2. В файле Vagrantfile необходимо изменить последовательность создания хостов с помощью модуля vagrant-hostmanager. Наполнение данных для него должно происходить после обработки синхронизируемых папок (все папки из синхронизируемых будут считаться доменными именами). Для того что бы это происходило необходимо добавить в код обработки синхронизируемых папок следующий код:
После обработки синхронизируемых папок добавить:
Массив hosts набирается ранее из настройки создаваемых хостов. (Оттуда нужно удалить настройку hostmanager)
3. Добавить в Vagrantfile запуск скрипта
config.vm.provision :shell, , run: 'always', :path => 'hosts.sh'
Сам скрипт положить туда же где и файл Vagrantfile.
Содержимое скрипта:
После этого при запуске по команде vagrant up все папки будут синхронизироваться в качестве сайтов. Что бы не перегружать виртуальную машину необходимо выполнить командуvagrant-hostmanager, а потом запустить скрипт hosts.sh на виртуальной машине.
Что бы облегчить себе жизнь я решил автоматизировать процесс добавления сайтов.
В качестве сайтов будут добавляться папки из синхронизируемой папки. Т.е. все те папки что попадут в /var/www/
Для того что бы всё это работало необходимо:
1. установить модуль vagrant-hostmanager (его и так необходимо устанавливать при использовании PuPHPet, для того что бы хосты пробрасывались)
2. В файле Vagrantfile необходимо изменить последовательность создания хостов с помощью модуля vagrant-hostmanager. Наполнение данных для него должно происходить после обработки синхронизируемых папок (все папки из синхронизируемых будут считаться доменными именами). Для того что бы это происходило необходимо добавить в код обработки синхронизируемых папок следующий код:
if Vagrant.has_plugin?('vagrant-hostmanager') d = Dir.new(folder['source']) entries = d.entries entries.delete_if { |entry| entry == '.' || entry == '..' } entries.map! { |entry| File.join(d.path,entry) } entries.delete_if { |entry| File.file?(entry) } entries.map! { |entry| entry.gsub(d.path, '') } entries.each do |dir| hosts.push(dir) end end
После обработки синхронизируемых папок добавить:
if Vagrant.has_plugin?('vagrant-hostmanager') if hosts.any? if config.vm.hostname.to_s.strip.length == 0 config.vm.hostname = 'puphpet-dev-machine' end config.hostmanager.enabled = true config.hostmanager.manage_host = true config.hostmanager.ignore_private_ip = false config.hostmanager.include_offline = false config.hostmanager.aliases = hosts.uniq end end
Массив hosts набирается ранее из настройки создаваемых хостов. (Оттуда нужно удалить настройку hostmanager)
3. Добавить в Vagrantfile запуск скрипта
config.vm.provision :shell, , run: 'always', :path => 'hosts.sh'
Сам скрипт положить туда же где и файл Vagrantfile.
Содержимое скрипта:
#!/bin/bash FOLDERS=`find /var/www/ -maxdepth 1 -name '*' -type d 2>/dev/null| sort|uniq|cut -d / -f 4` for FOLDER in $FOLDERS; do if [ -n "$FOLDER" ]; then if [ -f "/etc/apache2/sites-available/$FOLDER.conf" ]; then rm /etc/apache2/sites-available/$FOLDER.conf fi echo "<VirtualHost *:80> ServerName $FOLDER ServerAlias www.$FOLDER DocumentRoot /var/www/$FOLDER LogLevel warn <Directory "/var/www/$FOLDER"> AllowOverride All Options Indexes FollowSymLinks MultiViews Order allow,deny Allow from all </Directory> ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/$FOLDER/$1 ## Logging ErrorLog "/var/log/apache2/$FOLDER.log" ServerSignature Off CustomLog "/var/log/apache2/$FOLDER.log" combined ## SetEnv/SetEnvIf for environment variables SetEnv APP_ENV dev </VirtualHost> " >> /etc/apache2/sites-available/$FOLDER.conf a2ensite $FOLDER fi done /etc/init.d/apache2 restart;
После этого при запуске по команде vagrant up все папки будут синхронизироваться в качестве сайтов. Что бы не перегружать виртуальную машину необходимо выполнить командуvagrant-hostmanager, а потом запустить скрипт hosts.sh на виртуальной машине.