41

私の Vagrant box はベース Linux (科学的 Linux) から構築されており、(シェル スクリプトを使用して) プロビジョニング中に Apache がインストールされます。

最近、Vagrant ファイル (v2) を次のように変更しました。

config.vm.synced_folder "public", "/var/www/sites.d/example.com",
   :owner => "apache", :group => "apache"

これは、ボックスがすでにプロビジョニングされており、再起動したばかりの場合にうまく機能します。

今、vagrant destroy && vagrant up私はエラーが発生した後:

mount -t vboxsf -o uid=`id -u apache`,gid=`id -g apache` 
   /var/www/sites.d/example.com /var/www/sites.d/example.com
id: apache: User does not exist

これは明らかです - 最初の実行時には、Apache はまだインストールされていません。

もちろん、醜い回避策は、コメントアウトして基本的なプロビジョニングをsynced_folder行い、コメントインしてから再起動することです。

それを解決するためのきれいなトリックはありますか?特にvagrant up、箱が新品であっても、常に中断することなく実行されます。

4

5 に答える 5

27

uid/gid 値を修正できる場合は、これらをマウント コマンドで使用できます。既存のユーザー/グループに関連付ける必要はありません。

これは、固定 (一致する) uid / gid 値を使用してパペットによって後で作成されるユーザーで行います

config.vm.synced_folder "foo", "/var/www/foo",
   id: "foo", :mount_options => ["uid=510,gid=510"]
于 2013-10-30T12:29:40.510 に答える
9

これは私がしたことです:

config.vm.synced_folder "./MyApp", "/opt/MyApp", owner: 10002, group: 1007, create: true

config.vm.provision :shell do |shell|
  shell.inline = "groupadd -g 1007 myapp;
                  useradd -c 'MyApp User' -d /opt/MyApp -g myapp -m -u 10002 myapp;"
end

ユーザー名とグループを (テキストとして) 使用する代わりに、uid と gid を使用します。次に、それらの ID でグループとユーザーを作成します。これは、実際のエラーが次のとおりであるためです。

mount -t vboxsf -o uid=`id -u myapp`,gid=`getent group myapp | cut -d: -f3` opt_MyApp /opt/MyApp
...
id: myapp: No such user

id コマンドがユーザーを認識できませんでした。そのため、コマンド ID を uid および gid に切り替えると、vagrant によって使用されなくなります。

このアプローチで私が得た唯一の警告は、ユーザーのホーム ディレクトリ (/opt/MyApp) が既に存在するということですが、それを受け入れるか、useradd コマンドを変更してホーム ディレクトリが既に存在する場合は無視することができます。

その前に、私が使用した回避策は次のとおりです。

vagrant up; vagrant provision; vagrant reload

しかし、それは良くもきれいでもありません。

于 2015-01-09T02:12:10.447 に答える
2

これをどのように解決したかというと、最初に共有をユーザーまたはグループ情報なしで Vagrantfile に構成したことです。次に、プロビジョニング フェーズで、共有をアンマウントし、適切なユーザーおよびグループ情報を使用して再マウントします。例えば:

exec {
'umount /share/location':
  command => 'umount /share/location';
} -> exec {
'mount /share/location':
  command => 'mount -t vboxsf -o uid=`id -u apache`,gid=`id -g apache` /share/name /share/location'

共有名は、virtualbox から確認するか、デバッグ フラグと非動作設定を使用してプロビジョニングを実行することで確認できます (実際のマウント コマンドが出力されます)。これは一種の回避策であり、すべての状況で機能するとは限りませんが、私にとってはうまくいきました.

于 2013-08-14T08:17:11.707 に答える