2013-07-31 4 views
36

Meine Vagrant-Box ist von einer Basis-Linux (wissenschaftliche Linux), während der Bereitstellung (mit Shell-Skripten), Apache ist installiert.Vagrant Huhn-und-Ei: Gemeinsamer Ordner mit UID = Apache Benutzer

Ich änderte vor kurzem die Vagrant Datei (v2) zu:

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

Welche gut, wenn die Box arbeitet bereits bereitgestellt wird und nur neu gestartet.

Jetzt, nach einem vagrant destroy && vagrant up erhalte ich die Fehlermeldung:

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 

Welche klar ist - wie bei der ersten Ausführung, Apache noch nicht installiert ist.

Ein hässlicher Workaround wäre natürlich, die grundlegende Bereitstellung mit dem 0 kommentiert auskommentieren, kommentieren und dann neu starten.

Gibt es einen sauberen Trick, um das zu lösen? Vor allem so, dass vagrant up immer ohne Unterbrechungen läuft, auch wenn die Box neu ist.

+1

Wie Sie Apache installieren? Eine Möglichkeit wäre, den synchronisierten Ordner mit User Vagrant zu erstellen und dann den Besitzer in Ihrem Provisionierungsskript/Kochbuch/etc. nachdem Apache installiert ist. – pauljm

+0

Apache wird über yum installiert. Der Dokumentenstamm ist ein freigegebener Ordner. Ich bin nicht sicher, was passiert, wenn ich den Besitzer dieses Ordners ändern -> würde auch die Besitzer auf den freigegebenen Ordner im Host-System ändern? Aber im Grunde Vagrant erzwingt einen Benutzer bei der Montage, ich glaube nicht, dass das funktioniert (aber nicht versucht) – Alex

+0

Ich glaube nicht, Besitzerwechsel auf den Gast-Ordner wirkt sich auf Berechtigungen auf den Host-Ordner (siehe http://StackOverflow.com/ Fragen/13566201/can-i-modifiziere-den-Besitz-für-einen-geteilten-Ordner-in-vagrant). Meine Annahme ist, dass der Host-Ordner den Benutzer vagrant als seinen Besitzer ausführt. Wenn es versucht, Besitzer zwischen Gast und Host zu synchronisieren, würde es ernsthafte Probleme geben, da der Host-Computer eine andere Gruppe von Benutzern als der Gast hat. Ich denke, Besitzerwechsel nach der Installation von Apache wird funktionieren. – pauljm

Antwort

7

Ryan Sechrest hat dealt extensively with this problem.

Eines der vorgestellten Lösungen ist:

Set permissions of directories to 777 and files to 666

config.vm.synced_folder "/Users/ryansechrest/Projects/Sites", 
    "/var/www/domains", mount_options: ["dmode=777", "fmode=666"] 
+0

config.vm.synced_folder ".", "/ Var/www/website", id: "webroot",: owner => "4444",: group => "4444" funktionierte besser für mich, das mounted vboxsf shared Volume mit UID/GID und Sie erstellen dann einen Benutzer mit dem gleichen während der Bereitstellung –

2

Wie ich das löste war, dass ich zuerst die Freigabe zu Vagrantfile ohne Benutzer- oder Gruppeninformationen konfigurierte. In der Provisioning-Phase hänge ich dann die Freigabe ab und montiere sie erneut mit den richtigen Benutzer- und Gruppeninformationen. z.B .:

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' 

Sie können die Freigabenamen von VirtualBox überprüfen oder durch die Bereitstellung mit Debug-Flag und nicht funktionierenden Einstellungen ausgeführt wird (es den eigentlichen Befehl mount druckt). Ich weiß, dass dies eine Art Workaround ist und vielleicht nicht in jeder Situation funktioniert, aber es hat für mich funktioniert.

+0

Funktioniert es beim Neustart der VM nach der Bereitstellung? – Alex

+0

@Alex ja. Obwohl es auf den Rest der Konfiguration ankommt. – kontulai

25

Wenn Sie die uid/gid Werte fixieren können Sie diese in der Mount-Befehl verwenden können - sie müssen sich nicht auf eine bestehende Benutzer/Gruppe

ich dies tun mit einem Benutzer, die von später erstellt wird Puppe befestigt mit (Matching) uid/gid Werte

config.vm.synced_folder "foo", "/var/www/foo", 
    id: "foo", :mount_options => ["uid=510,gid=510"] 
+0

Ich habe einen 'kevin' Benutzer mit einem' uid/gid' von * 1000 * erstellt: '$ cat/etc/passwd | grep kevin' .... 'kevin: x: 1000: 1000 ::/home/kevin:/bin/bash ', aber das Hinzufügen dieses Eintrags zu meiner '.kitchen.yml' hat nicht funktioniert -' ["c :/dev/share ","/Pfad/zu/share "," create: true "," Typ: rsync "," mount_options: [uid = 1000] "]. Das Verzeichnis '/ path/to/share' ist immer noch im Besitz von' vagrant' –

+2

Für rsync anstelle der mount_options würden Sie die Optionen 'owner: 1000',' group: 1000' verwenden. – littleforest

+2

Wie sagen Sie der Apache-Installation was UID und GID für den Apache-Benutzer und -Gruppe verwenden? –

8

das ist, was ich tat:

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 

Statt Verwendung der Benutzername und Gruppe (als Text) verwenden, um die uid und gid. Erstellen Sie dann die Gruppe und den Benutzer mit diesen IDs. Dies liegt daran, dass der tatsächliche Fehler wie folgt lautet:

Der ID-Befehl konnte den Benutzer nicht erkennen. Also, Wechsel zu UID und GID die Befehls-ID wird nicht von Vagrant verwendet werden. Die einzige Warnung, die ich mit diesem Ansatz bekommen habe, ist, dass das Benutzer-Home-Verzeichnis (/ opt/MyApp) bereits existiert, aber ich kann damit leben, oder Sie können den useradd-Befehl ändern, um das Home-Verzeichnis zu ignorieren, wenn es bereits existiert.

Davor, die Abhilfe, die ich verwenden:

vagrant up; vagrant provision; vagrant reload 

Aber, es ist nicht schön, weder sauber.

Verwandte Themen