我是 Vagrant 和 Puppet 新手,我使用 Debian Squeeze 和独立 Puppet 创建了一个 Base Box,使用点击此处了解如何使用 Puppetlabs 软件包安装 Puppet。
该盒子本身似乎已成功导入,但是一旦我开始配置它,我就会收到似乎与主机上的 nfs 共享有关的错误。1000 是虚拟机上 Vagrant 用户的 uid。
错误:
Error: Failed to set owner to '1000': Operation not permitted - /vagrant/www/index.php
Error: /Stage[main]/Perchdemo::Sites::Create/File[/vagrant/www/index.php]/owner: change from 501 to vagrant failed: Failed to set owner to '1000': Operation not permitted - /vagrant/www/index.php
当我使用 Puppet 将 index.php 文件复制到主机文件系统上的共享 /vagrant/www 时,就会发生这种情况。我在虚拟机上独立安装的 Puppet 中使用了这个 Puppet 模块,文件托管在虚拟机的文件系统上,但理想情况下我希望它们位于 nfs 共享上。
编辑了更多信息。经过一番摸索,错误最初发生在我使用 puppetlabs apache 模块创建 vhost 时。然而,无论我尝试在哪个用户下强制创建,都会失败并出现相同的错误。
我的 VagrantFile 如下。
Vagrant::Config.run do |config|
config.vm.box = "squeeze64"
config.vm.network :hostonly, "10.1.0.52"
config.nfs.map_uid = :auto
config.nfs.map_gid = :auto
config.vm.forward_port 80, 8080
config.vm.share_folder("v-web", "/vagrant/www", "./www", :nfs => true)
config.vm.provision :shell, :inline => "echo \"Europe/London\" | sudo tee /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata"
config.vm.provision :shell, :inline => "apt-get update --fix-missing"
config.vm.provision :shell, :inline => "apt-get upgrade"
config.vm.provision :puppet do |puppet|
puppet.facter = { "fqdn" => "perchtutorial.eoms"}
puppet.manifests_path = "puppet/manifests"
puppet.manifest_file = "perchtutorial.pp"
puppet.module_path = "puppet/modules"
end
end
答案1
为了解决此权限问题,我添加了以下内容Vagrantfile
:
if (/darwin/ =~ RUBY_PLATFORM) != nil
config.vm.synced_folder ".", "/host/path/to/shared/folder", nfs: true, :bsd__nfs_options => ["-maproot=0:0"]
else
config.vm.synced_folder ".", "/host/path/to/shared/folder", nfs: true, :linux__nfs_options => ["no_root_squash"]
end
它将根据您的主机操作系统(OSX 或 Linux)调整 NFS 选项。
答案2
这可能是由 NFS 服务器上的“根压缩”引起的。
当 NFS 客户端计算机上的 root 用户尝试操作导出的 NFS 文件系统上的文件时,它会以非特权用户(通常是 nobody 或 nfsnobody)的权限进行操作。在这种情况下,如果我没有看错的话,可能是 Puppet(以 root 身份运行)无法操作 NFS 服务器上的文件,因为它的权限被映射到这个非特权用户。
要删除根压缩,请在 NFS 服务器上编辑 /etc/exports,并添加no_root_squash
到导出文件系统的选项,然后运行exportfs -av
以重新导出文件系统。
/etc/exports 行示例:
/srv 192.168.0.0/24 (rw,no_root_squash)
答案3
mbarthelemy 的回答帮助我完成了一半,但最后,我不得不再做一些调整:
在我的 VagrantFile 中,我将其添加到映射中以使其正常工作:
:linux__nfs_options => ["no_root_squash"], :map_uid => 0, :map_gid => 0