28 декабря 2014 г.

Vagrant + PuPHPet + множество сайтов

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

Что бы облегчить себе жизнь я решил автоматизировать процесс добавления сайтов.
В качестве сайтов будут добавляться папки из синхронизируемой папки. Т.е. все те папки что попадут в /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 на виртуальной машине.

Комментариев нет:

Отправить комментарий