Laravel 4使用Puppet的Vagrant盒子的权限

Adr*_*ian 14 file-permissions puppet vagrant laravel laravel-4

我成功地使用http://www.puphpet.com为许多项目生成了vagrant + puppet环境.然后本周我的任务是使用Laravel 4为一个项目编写一个原型.由于我不打算成为那个全职工作项目的人,我认为最好为下一个项目创建一个VM环境.人只能克隆回购.没有太多使用Laravel 4的经验我在开发环境中运行得很好.然后我尝试运行第一次迁移,这里的问题从app/storage文件权限开始.

1. app/storage必须可由Web用户写入

好的,从同步文件夹配置中取出id:vagrant并将所有者和组设置为www-data,如下所示:

 config.vm.synced_folder "./www", "/var/www", owner: "www-data", group: "www-data"
Run Code Online (Sandbox Code Playgroud)

2.工匠只能从流浪者箱内运行才能进入DB

很好,vagrant ssh并从www文件夹运行工匠.

3. app/storage&app/database必须由vagrant用户写入才能使用迁移

Grrr,好的,将以下可怕的代码添加到vagrant文​​件中(注意,首先尝试在Puppet中执行此操作并且不执行此操作):

config.vm.provision :shell, :inline =>
  "usermod -a -G www-data vagrant"
Run Code Online (Sandbox Code Playgroud)

4. app/storage&app/database不能被组写入

哎呀!好吧,让我们试试这个Puppet指令:

file { "/var/www/app/storage":
  source => "/var/www/app/storage/",
  mode => 0775,
  ensure  => 'directory',
  owner   => 'www-data',
  group   => 'www-data',
  recurse => true
}
Run Code Online (Sandbox Code Playgroud)

不,不行.试图用Puppet exec {}指令做同样的事情没有效果.似乎vagrant synced文件夹的权限由主机设置,而不是guest.

最后,最终手动更改主机中文件夹的权限.有没有更简单的方法来做到这一点?我真的希望能够为下一个开发人员提供一个无忧无虑的环境,他们可以从回购中克隆,而不是让他们在克隆后重新设置一切.

UPDATE

我们已经发现,如果我们更改Apache运行用户,vagrant不会在重新加载时覆盖它.所以我们手动完成了它,它比更改同步文件夹的权限和所有者更好.现在我们只想弄清楚如何在Puppet中手动进行更改.

Adr*_*ian 19

在Twitter上进行一些讨论之后,想出了以下内容:

VirtualBox上存在一个限制,它不允许您从来宾操作系统内部为同步文件夹设置权限.在github上看到这个问题.

您可以使用以下代码从vagrant文​​件设置同步文件夹权限:

config.vm.synced_folder ".", "/vagrant", :mount_options => ["dmode=777","fmode=666"]
Run Code Online (Sandbox Code Playgroud)

或者您可以将Apache运行时用户从puppet清单更改为vagrant,如下所示:

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'],
}
Run Code Online (Sandbox Code Playgroud)

或以上的任何组合


Ble*_*ing 9

我在设置中没有使用pupphet,我想出了两个解决方案:

(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
Run Code Online (Sandbox Code Playgroud)

(2)我的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"]
Run Code Online (Sandbox Code Playgroud)