Laravel 4 Права на боксерскую коробку с кукольным

Я успешно использовал http://www.puphpet.com для создания бродячих + марионеточных сред для ряда проектов. Затем на этой неделе мне поручили написать прототип для проекта с использованием Laravel 4. Поскольку я не буду работать над проектом полностью, я решил, что лучше всего создать для него среду VM, чтобы следующий человек может просто клонировать для репо. Не имея большого опыта работы с Laravel 4, я получил все, чтобы работать в среде Dev просто отлично. Затем я попытался выполнить первую миграцию, и здесь проблемы начинаются с разрешений файла app/storage.

1. приложение/хранилище должно быть доступно для записи веб-пользователем

Хорошо, вытащил id: брандмауэр из предустановленной синхронизации и установил владельца и группу в www-данные следующим образом:

 config.vm.synced_folder "./www", "/var/www", owner: "www-data", group: "www-data"

2. Artisan можно запустить только изнутри бродячего ящика, чтобы иметь доступ к DB

Прекрасно, vagrant ssh и запустите мастер из папки www.

3. приложение/хранилище и приложение/база данных должны быть доступны для записи бродячим пользователем, чтобы использовать миграции

Grrr, ok, добавил следующий ужасный фрагмент кода в бродячий файл (заметьте, сначала попытался сделать это в Puppet, и он не взял):

config.vm.provision :shell, :inline =>
  "usermod -a -G www-data vagrant"

4. приложение/хранилище и приложение/база данных не могут быть записаны группой

Argh!!! Хорошо, попробуйте эту директиву Puppet:

file { "/var/www/app/storage":
  source => "/var/www/app/storage/",
  mode => 0775,
  ensure  => 'directory',
  owner   => 'www-data',
  group   => 'www-data',
  recurse => true
}

Нет, не работает. Пытался сделать то же самое с директивой Puppet exec {}. Кажется, что разрешения для синхронизированной папки с бродягой устанавливаются хостом, а не гостем.

Наконец, в результате вручную были изменены разрешения для папки на главной машине. Есть ли более простой способ сделать это? Я бы просто хотел, чтобы у вас появилась следующая среда, свободная от беспокойства, которую они могут клонировать из репо, а не повторять настройку после клонирования.

UPDATE

Мы выяснили, что если мы изменим пользователя запуска Apache, бродяга не переопределит его при перезагрузке. Таким образом, мы сделали это вручную, и он работает лучше, чем изменение разрешенных прав доступа и владельца. Теперь мы просто пытаемся выяснить, как сделать это изменение вручную в Puppet.

Ответы

Ответ 1

После некоторого обсуждения в Twitter выяснилось следующее:

Существует ограничение от VirtualBox на бродяге, которое не позволяет вам устанавливать разрешения для синхронизированной папки из гостевой ОС. См. эту проблему в github.

Вы можете использовать следующий код для установить разрешения для синхронизированной папки из бродячего файла:

config.vm.synced_folder ".", "/vagrant", :mount_options => ["dmode=777","fmode=666"]

Или вы можете изменить пользователя времени выполнения Apache, чтобы он выглядел так же, как марионетка:

exec { "change_httpd_user":
    command => "sed -i 's/www-data/vagrant/g' /etc/apache2/envvars",
    onlyif => "/bin/grep -q 'www-data' '/etc/apache2/envvars'",
    notify => Service['apache2'],
    require => Package['apache2'],
}

file { "/var/lock/apache2":
    ensure => "directory",
    owner => "vagrant",
    group => "vagrant",
    require => Exec['change_httpd_user'],
}

Или любая комбинация вышеперечисленных

Ответ 2

Я не использую pupphet в моей настройке, и я придумал 2 решения:

(1) В моем файле bootstrap.sh:

sudo sed -i 's/APACHE_RUN_USER=.*/APACHE_RUN_USER=vagrant/g' /etc/apache2/envvars
sudo sed -i 's/APACHE_RUN_GROUP=.*/APACHE_RUN_GROUP=www-data/g' /etc/apache2/envvars

(2) Im my VagrantFile:

config.vm.synced_folder "./", "/vagrant", id: "vagrant-root" , :owner => "vagrant", :group => "www-data"

config.vm.synced_folder "./app/storage", "/vagrant/app/storage", id: "vagrant-storage",
    :owner => "vagrant",
    :group => "www-data",
    :mount_options => ["dmode=775","fmode=664"]

config.vm.synced_folder "./public", "/vagrant/public", id: "vagrant-public",
    :owner => "vagrant",
    :group => "www-data",
    :mount_options => ["dmode=775","fmode=664"]