2013-07-31 28 views
36

Hộp âm đạo của tôi được xây dựng từ Linux cơ sở (linux khoa học), trong khi cấp phép (sử dụng shell script), Apache được cài đặt.Thịt gà và trứng lang thang: Thư mục dùng chung với người dùng uid = apache

thời gian gần đây tôi đã thay đổi các tập tin Vagrant (v2) tới:

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

nào hoạt động tốt nếu hộp đã được cung cấp và chỉ khởi động lại.

Bây giờ, sau một vagrant destroy && vagrant up tôi nhận được lỗi:

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 

Đó là rõ ràng - như trong thời gian ban đầu, apache chưa được cài đặt.

Một cách giải quyết xấu sẽ tất nhiên là làm điều khoản cơ bản với điều đó synced_folder nhận xét, nhận xét và sau đó khởi động lại.

Có mẹo vặt nào để giải quyết vấn đề đó không? Đặc biệt theo cách mà vagrant up luôn chạy mà không bị gián đoạn, ngay cả khi hộp mới.

+1

How are you cài đặt Apache? Một tùy chọn sẽ là tạo thư mục được đồng bộ hóa với người dùng lang thang và sau đó thay đổi chủ sở hữu trong tập lệnh cung cấp/sách dạy nấu ăn/v.v. sau khi Apache được cài đặt. – pauljm

+0

Apache được cài đặt qua yum. Gốc tài liệu là một thư mục được chia sẻ. Tôi không chắc chắn những gì sẽ xảy ra nếu tôi thay đổi chủ sở hữu của thư mục này -> cũng sẽ thay đổi chủ sở hữu trên thư mục được chia sẻ trong hệ thống máy chủ lưu trữ? Nhưng về cơ bản thì không có nghĩa là thực thi người dùng khi gắn kết, tôi không nghĩ rằng các công trình (nhưng không thử) – Alex

+0

Tôi không nghĩ rằng việc thay đổi quyền sở hữu trên thư mục khách sẽ ảnh hưởng đến quyền trên thư mục lưu trữ (xem http://stackoverflow.com/ câu hỏi/13566201/can-i-modify-the-quyền sở hữu-cho-một-chia sẻ-thư mục-trong-lang thang). Giả định của tôi là thư mục lưu trữ được người dùng chạy lang thang như chủ sở hữu của nó. Nếu nó cố gắng đồng bộ chủ sở hữu giữa khách và máy chủ, sẽ có vấn đề nghiêm trọng, vì máy chủ có một nhóm người dùng khác với khách. Tôi nghĩ rằng việc thay đổi chủ sở hữu sau khi cài đặt apache sẽ hoạt động. – pauljm

Trả lời

7

Ryan Sechrestdealt extensively with this problem.

Một trong những giải pháp được trình bày là:

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" hoạt động tốt hơn cho tôi, điều này gắn kết vboxsf được chia sẻ khối lượng với uid/gid và sau đó bạn tạo một người dùng giống nhau trong khi cung cấp –

2

Cách tôi giải quyết điều này là lần đầu tiên tôi định cấu hình chia sẻ thành Vagrantfile mà không có thông tin người dùng hoặc nhóm. Sau đó, trong giai đoạn cung cấp, tôi tháo gắn kết và chia sẻ nó với thông tin người dùng và nhóm thích hợp. ví dụ:

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' 

Bạn có thể kiểm tra tên chia sẻ từ hộp ảo hoặc bằng cách chạy cấp phép với cờ gỡ lỗi và cài đặt không hoạt động (nó in ra lệnh gắn kết thực). Tôi biết đây là cách giải quyết và có thể không hoạt động trong mọi tình huống, nhưng nó có hiệu quả đối với tôi.

+0

Tính năng này có hoạt động khi khởi động lại VM sau khi đã được cấp phép không? – Alex

+0

@Alex yes. Mặc dù nó phụ thuộc vào phần còn lại của cấu hình. – kontulai

25

Nếu bạn có thể sửa chữa các giá trị gid/uid bạn có thể sử dụng chúng trong các lệnh mount - họ không cần phải liên quan đến một người sử dụng/nhóm hiện có

Tôi làm điều này với một người sử dụng mà sau này được tạo ra bởi múa rối sử dụng cố định (phù hợp) uid/gid giá trị

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

Tôi đã tạo một người dùng 'kevin' bằng' uid/gid' của * 1000 *: '$ cat/etc/passwd | grep kevin' .... 'kevin: x: 1000: 1000 ::/home/kevin:/bin/bash ', nhưng việc thêm mục này vào '.kitchen.yml' của tôi không hoạt động -' ["c :/dev/share ","/path/to/share "," create: true "," type: rsync "," mount_options: [uid = 1000] "]'. Thư mục '/ path/to/share' vẫn thuộc sở hữu của' vagrant' –

+2

Đối với rsync thay vì sử dụng mount_options, bạn sẽ sử dụng tùy chọn 'owner: 1000',' group: 1000' – littleforest

+2

Làm thế nào để bạn biết cài đặt Apache uid và gid để sử dụng cho người dùng apache và nhóm? –

8

Đây là những gì tôi đã làm:

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 

Thay vì sử dụng tên người dùng và nhóm (như là một văn bản) sử dụng uid và gid. Sau đó, tạo nhóm và người dùng với các id đó. Điều này là do lỗi trên thực tế là:

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

Lệnh id không thể nhận ra người dùng. Vì vậy, chuyển sang uid và gid id lệnh sẽ không được sử dụng bởi vagrant.

Cảnh báo duy nhất tôi có với phương pháp này là thư mục gốc của người dùng (/ opt/MyApp) đã tồn tại, nhưng tôi có thể sống với điều đó hoặc bạn có thể thay đổi lệnh useradd để bỏ qua thư mục chính nếu đã tồn tại.

Trước đó, thực hiện giải pháp tôi sử dụng là:

vagrant up; vagrant provision; vagrant reload 

Tuy nhiên, nó không đẹp không sạch.

Các vấn đề liên quan