使用Puppet在Vagrant box上设置Laravel 4权限

14

我一直成功地使用http://www.puphpet.com来生成vagrant+puppet环境用于多个项目。然后这个星期,我被要求使用Laravel 4为一个项目编写原型。由于我不会全职工作于该项目,我认为最好为它创建一个VM环境,以便下一个人可以克隆该环境进行开发。虽然我没有太多Laravel 4的经验,但在dev环境中一切都运行良好。然后我尝试运行第一个迁移,并且遇到了与app/storage文件权限相关的问题。

1. app/storage必须由Web用户具有可写权限

没问题,我从同步文件夹配置中删除了id:vagrant,并将所有者和组设置为www-data,如下所示:

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

2. 为了访问数据库,Artisan 只能从 Vagrant box 内部运行

好的,使用 vagrant ssh 进入 www 文件夹并运行 Artisan。

3. 为了使用迁移,必须让 vagrant 用户对 app/storage 和 app/database 具有可写权限

好的,很烦人,现在我要将下面这段可怕的代码添加到 Vagrant 文件中(注意,我先尝试了 Puppet,但没有成功):

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

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
}

不行,无效。尝试使用Puppet的exec {}指令做同样的事情,但没有任何效果。看来vagrant同步文件夹的权限由主机而非客户机设置。

最终,我手动更改了主机上文件夹的权限。有没有更简单的方法?我只想为下一个开发人员提供一个无忧的环境,他们可以从版本库中克隆出来,而不必在克隆后重新设置一切。

更新

我们已经发现,如果更改Apache运行用户,则vagrant不会在重新加载时覆盖它。因此,我们手动进行了更改,并且比更改同步文件夹的权限和所有者效果更好。现在,我们正在尝试找出如何在Puppet中手动进行这种更改。


1
我和你一样,都遇到了相同的问题,关于#2。你可以使用xip.io地址(例如testing.10.10.10.10.xip.io)来设置你的环境,并授予root权限(或者是你的Laravel安装所连接的用户)远程权限。这样,在主机上运行artisan db命令时,它应该能够找到mysql盒子并登录。明白我的意思吗?注意:我还必须解除mysql的绑定:sudo nano /etc/mysql/my.cnf ;skip-external-locking ;bind-address保存并重新加载。希望这可以帮助你! - dpluscc
好的,我们会尝试一下并看看结果如何。谢谢你的提示。 - Adrian
最终问题在于更改权限。不过,我仍然可能会使用您的建议来获取数据库的远程访问权限。 - Adrian
3个回答

19

在 Twitter 上讨论后,我找到了以下结论:

VirtualBox 对 vagrant 施加了限制,不允许您在客户操作系统内部设置同步文件夹的权限。请参考此 github 上的问题。

您可以使用以下代码在 vagrant 文件中设置同步文件夹权限

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

或者你可以像这样从puppet清单中将Apache运行时用户更改为vagrant:change the Apache runtime user

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'],
}

或以上任意组合


嘿 @MattSetter,告诉我进展如何。我已经有一段时间没有使用这个了,也不知道Vagrant或puppet是否有所改变。 - Adrian
1
我无法使用它。不确定是由于缺乏经验还是时间不够。但我选择在Puppet的config.yaml和Vagrantfile中设置权限和所有权。感谢提供信息,也感谢您的询问。 - Matthew Setter

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

(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"]

谢谢分享,很高兴看到如何在没有Puppet的情况下完成。以及如何更改文件夹的所有者/组。 - Adrian

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接