私はVagrantとPuppetの初心者です。DebianSqueezeとスタンドアロンPuppetを使用してベースボックスを作成し、 Puppetlabsパッケージを使用してPuppetをインストールするための手順 を使用します。
ボックス自体は正常にインポートされているようですが、プロビジョニングを開始すると、ホスト上のnfs共有に関係しているように見えるエラーが発生します。 1000は、vmの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モジュールを、ファイルがvmのファイルシステムでホストされているvm上の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
この権限の問題を取り除くために、ここに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
ホストOS(OSXまたはLinux)に応じてNFSオプションを適合させます。
これは、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)
mbarthelemyの回答で途中まで行きましたが、結局、もう少し微調整する必要がありました。
私のVagrantFileでは、これをマッピングに追加して機能させました。
:linux__nfs_options => ["no_root_squash"], :map_uid => 0, :map_gid => 0