2013-07-31 6 views
36

Moje pudełko Vagrant zbudowane jest z linuksa bazowego (linux naukowy), podczas udostępniania (przy użyciu skryptów powłoki), zainstalowany jest Apache.Włóczęgowate jaja kurze: Udostępniony folder z użytkownikiem uid = apache

Niedawno zmienił plik włóczęga (V2) do:

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

który działa dobrze, jeśli okno jest już zabezpieczony i właśnie uruchomiony ponownie.

Teraz, po vagrant destroy && vagrant up pojawia się błąd:

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 

Która jest jasne - jak w początkowym okresie, apache nie jest jeszcze zainstalowany.

Brzydkim obejściem byłoby oczywiście wykonanie podstawowego zaopatrzenia z tym synced_folder skomentowanym, skomentuj go, a następnie uruchom ponownie.

Czy istnieje jakiś czysty sposób na rozwiązanie tego problemu? Szczególnie w taki sposób, że zawsze działa bez przerw, nawet jeśli pudełko jest nowe.

+1

Jak się instalacją Apache? Jedną opcją byłoby utworzenie zsynchronizowanego folderu z użytkownikiem vagrant, a następnie zmiana właściciela w swoim skryptu obsługi administracyjnej/książce kucharskiej/etc. po zainstalowaniu Apache. – pauljm

+0

Apache jest instalowany przez yum. Główny dokument to folder współdzielony. Nie jestem pewien, co się stanie, jeśli zmienię właściciela tego folderu -> czy zmieniłbym właścicieli w folderze współdzielonym w systemie hosta? Ale w zasadzie vagrant wymusza na użytkownikach podczas montowania, nie sądzę, że działa (ale nie próbowałem) – Alex

+0

Nie sądzę, aby zmiana prawa własności w folderze guest wpłynęła na uprawnienia w folderze hosta (zobacz http://stackoverflow.com/ pytania/13566201/can-i-modify-the-ownership-for-a-shared-folder-in-vagrant). Zakładam, że folder hosta powoduje, że użytkownik uruchamia vagrant jako jego właściciel. Jeśli spróbuje zsynchronizować właścicieli między gościem a hostem, wystąpią poważne problemy, ponieważ komputer hosta ma inny zestaw użytkowników niż gość. Myślę, że zmiana właścicieli po zainstalowaniu Apache będzie działać. – pauljm

Odpowiedz

7

Ryan Sechrest ma dealt extensively with this problem.

Jednym z prezentowanych rozwiązań jest:

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" działało lepiej dla mnie, to montuje udostępniony vboxsf volume z uid/gid, a następnie utworzysz użytkownika z tym samym podczas udostępniania –

2

W jaki sposób to rozwiązałem, najpierw skonfigurowałem udział w Vagrantfile bez informacji o użytkowniku lub grupie. Następnie w fazie rezerwowania odmontowuję udział i ponownie go podłączam, korzystając z odpowiednich informacji o użytkowniku i grupie. np .:

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' 

Można sprawdzić nazwę udziału z VirtualBox lub uruchamiając provisioning z flagą debugowania i spoza ustawień pracy (drukuje się rzeczywisty polecenie montowania). Wiem, że to trochę obejście i może nie działać w każdej sytuacji, ale zadziałało to dla mnie.

+0

Czy działa po ponownym uruchomieniu maszyny wirtualnej po jej udostępnieniu? – Alex

+0

@Alex tak. Chociaż zależy to od reszty konfiguracji. – kontulai

25

Jeśli można ustalić wartości UID/GID można użyć tych w poleceniu mount - oni nie muszą odnosić się do istniejącego użytkownika/grupy

Czynię to z użytkownikiem, który jest później stworzonego przez kuk użyciu trwałych (dopasowanie) uid/gid

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

Stworzyłem użytkownika 'kevin' z' uid/gid' z * 1000 *: '$ cat/etc/passwd | grep kevin' .... 'kevin: x: 1000: 1000 ::/home/kevin:/bin/bash ', ale dodanie tego wpisu do mojego '.kitchen.yml' nie działało -' ["c :/dev/share ","/path/to/share "," create: true "," type: rsync "," mount_options: [uid = 1000] "]'. Katalog '/ path/to/share' nadal należy do' vagrant''a –

+2

Dla rsync zamiast używać mount_options, używałbyś opcji 'owner: 1000',' group: 1000'' – littleforest

+2

Skąd wiesz o instalacji Apache'a? uid i gid do użycia dla użytkownika i grupy apache? –

8

To jest to, co zrobiłem:

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 

Zamiast używać nazwy użytkownika i grupy (jako tekst) używać UID i GID. Następnie utwórz grupę i użytkownika z tymi identyfikatorami. Dzieje się tak dlatego, że błąd jest następujący:

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

Komenda id nie mogła rozpoznać użytkownika. Tak więc przełączenie na uid i gid identyfikatora polecenia nie będzie używane przez włóczęgę.

Jedyne ostrzeżenie, które otrzymałem z tym podejściem, to że katalog domowy użytkownika (/ opt/MyApp) już istnieje, ale mogę z tym żyć, lub możesz zmienić polecenie useradd, aby zignorować katalog domowy, jeśli już istnieje.

Wcześniej obejście użyłem to:

vagrant up; vagrant provision; vagrant reload 

Ale to nie ładne ani czyste.