【问题标题】:Laravel 4 Permissions on a Vagrant box with PuppetLaravel 4 Permissions on a Vagrant box with Puppet
【发布时间】:2013-09-10 00:13:18
【问题描述】:

我已经成功使用http://www.puphpet.com 为多个项目生成 vagrant+puppet 环境。然后这周我的任务是使用 Laravel 4 为一个项目编写原型。由于我不会全职从事这个项目,我认为最好为它制作一个 VM 环境,下一个人可以克隆回购。我对 Laravel 4 没有太多经验,我可以在开发环境中运行一切都很好。然后我尝试运行第一次迁移,这里的问题从app/storage 文件权限开始。

1.应用/存储必须可由网络用户写入

好的,从同步的文件夹配置中取出 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. app/storage & app/database 必须是 vagrant 用户可写才能使用迁移

Grrr,好的,在 vagrant 文件中添加了以下糟糕的代码(注意,首先尝试在 Puppet 中执行此操作,但没有成功):

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

4.应用程序/存储和应用程序/数据库不可由组写入

啊!!!好的,让我们试试这个 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 synced 文件夹的权限是由主机设置的,而不是来宾。

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

更新

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

【问题讨论】:

  • 我和你和RE:#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 保存并重新加载。希望这会有所帮助!
  • 是的,我们会试一试,看看效果如何。感谢您的提示。
  • 最终是更改权限的问题。不过,我可能仍会使用您的建议来远程访问数据库。

标签: laravel laravel-4 file-permissions vagrant puppet


【解决方案1】:

在推特上经过一番讨论,得出以下结论:

VirtualBox 对 vagrant 有一个限制,不允许您从来宾操作系统内部为同步文件夹设置权限。 See this issue on github.

您可以使用以下代码从 vagrant 文件中set the synced folder permissions

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

或者你可以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 是否改变了一些事情。
  • 我无法使用它。不知道是因为经验不足,还是时间不够。但是我在 puppet 的 config.yaml 和 Vagrantfile 中设置了权限和所有权。不过感谢您提供的信息和询问。
【解决方案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) 我是我的 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怎么做。以及如何更改文件夹的所有者/组。
【解决方案3】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 2016-09-27
    • 2013-08-27
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多