Показаны сообщения с ярлыком puphpet. Показать все сообщения
Показаны сообщения с ярлыком puphpet. Показать все сообщения

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 на виртуальной машине.

21 ноября 2014 г.

Vagrant x32 (Apache trouble)

При использовании Vagrant совместно с конструктором виртуальной машины, вы можете столкнуться с проблемой что при использовании 32 битной виртуальной машины Apache не будет стартовать а выпадать с подобной ошибкой
Error:
==> default: Notice: /Stage[main]/Apache::Default_mods/Apache::Mod[authz_user]/File[authz_user.load symlink]/target: target changed '../mods-available/authz_user.load' to '/etc/apache2/mods-available/authz_user.load'
==> default: Info: /Stage[main]/Apache::Default_mods/Apache::Mod[authz_user]/File[authz_user.load symlink]: Scheduling refresh of Service[httpd]
==> default: Notice: /Stage[main]/Apache/File[/etc/apache2/mods-enabled/mpm_event.conf]/ensure: removed
==> default: Notice: /Stage[main]/Apache/File[/etc/apache2/mods-enabled/status.load]/ensure: removed
==> default: Notice: /Stage[main]/Apache/File[/etc/apache2/mods-enabled/status.conf]/ensure: removed
==> default: Notice: /Stage[main]/Apache/File[/etc/apache2/mods-enabled/mpm_event.load]/ensure: removed
==> default: Info: /etc/apache2/mods-enabled: Scheduling refresh of Class[Apache::Service]
==> default: Info: Class[Apache::Service]: Scheduling refresh of Service[httpd]
==> default: Notice: /Stage[main]/Main/File[/var/run/apache2/ssl_mutex]/ensure: created
==> default: Info: /Stage[main]/Main/File[/var/run/apache2/ssl_mutex]: Scheduling refresh of Service[httpd]
==> default: Notice: /Stage[main]/Apache::Service/Service[httpd]: Triggered 'refresh' from 74 events
==> default: Info: Creating state file /var/lib/puppet/state/state.yaml
==> default: Notice: Finished catalog run in 514.86 seconds
The SSH command responded with a non-zero exit status. Vagrant
assumes that this means the command failed. The output for this command
should be in the log above. Please read the output to determine what
went wrong. 

Эта проблема возникает из за использования в сборке puppet apache версии 2.4.
Решить можно двумя способами:
- при конфигурировании puphpet указать использование php в качестве php_mod
- подправить файл apache.pp где в районе 11 строки вынести переменную $apache_version из условия и присвоить ей значение $apache_version  = $apache::version::default