web-dev-qa-db-fra.com

Oeuf et poule vagabonde: dossier partagé avec uid = utilisateur Apache

Ma boîte Vagrant est construite à partir d'une base Linux (Scientific Linux), lors de la configuration (à l'aide de scripts Shell), Apache est installé.

J'ai récemment changé le fichier Vagrant (v2) en:

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

Ce qui fonctionne bien si la boîte est déjà approvisionnée et vient de redémarrer.

Maintenant, après un vagrant destroy && vagrant up je reçois l'erreur:

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

Ce qui est clair - comme lors de l'exécution initiale, Apache n'est pas encore installé.

Une solution de contournement désagréable consisterait bien entendu à effectuer le provisionnement de base avec le synced_folder commenté, à le commenter puis à redémarrer.

Y at-il un truc propre pour résoudre ce problème? Surtout de manière que vagrant up soit toujours exécuté sans interruption, même si la boîte est neuve.

39
Alex

Ryan Sechrest a a longuement traité ce problème .

Une des solutions présentées est:

Définir les autorisations des répertoires sur 777 et des fichiers sur 666

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

Si vous pouvez corriger les valeurs uid/gid, vous pouvez les utiliser dans la commande mount - elles n'ont pas à être associées à un utilisateur/groupe existant

Je fais cela avec un utilisateur créé ultérieurement par puppet à l'aide de valeurs uid/gid fixes (correspondantes)

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

C'est ce que j'ai fait:

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

Au lieu d'utiliser le nom d'utilisateur et le groupe (en tant que texte), utilisez l'uid et le gid. Créez ensuite le groupe et l'utilisateur avec ces identifiants. C'est parce que l'erreur est en fait:

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

La commande id n'a pas pu reconnaître l'utilisateur. Donc, passer à uid et gid, l'identifiant de commande ne sera pas utilisé par vagabond.

Le seul avertissement que j'ai avec cette approche est que le répertoire de base de l'utilisateur (/ opt/MyApp) existe déjà, mais je peux vivre avec cela ou vous pouvez changer la commande useradd pour ignorer le répertoire de base s'il existe déjà.

Avant cela, la solution que j'ai utilisée est la suivante:

vagrant up; vagrant provision; vagrant reload

Mais, ce n'est ni Nice ni propre. 

9
Johandry

J'ai résolu ce problème en configurant le partage sur Vagrantfile sans informations sur l'utilisateur ou le groupe. Ensuite, lors de la phase de provisionnement, démontez le partage et remontez-le avec les informations appropriées sur l'utilisateur et le groupe. par exemple.:

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'

Vous pouvez vérifier le nom du partage dans virtualbox ou en exécutant le provisioning avec un indicateur de débogage et des paramètres inactifs (la commande de montage réelle est imprimée). Je sais que c'est un peu une solution de contournement et peut ne pas fonctionner dans toutes les situations, mais cela a fonctionné pour moi.

2
kontulai

Dans mon cas, je n'ai pas besoin du synced_folder pour être monté pendant la phase de provision. Donc, je désactive le synced_folder si l'invité n'est pas approvisionné.

Vérifiez si cela est prévu dans Vagrantfile est un hack mais ça marche .

Et pour moi c'est assez juste de faire 

vagrant up   # To build and provision the first time
vagrant halt # An intermediate step to mount the folder
vagrant up   # To have the folder mounted

Donc, mon Vagrantfile est quelque chose comme:

def provisioned?(vm_name='default', provider='virtualbox')
  File.exist?(".vagrant/machines/#{vm_name}/#{provider}/action_provision")
end

Vagrant.configure(2) do |config|
  [ ... ]
  config.vm.synced_folder "../geoserver_data", "/var/lib/geoserver_data",
    disabled: !provisioned?,
    owner: "Tomcat7",
    group: "Tomcat7"
  [ ... ] 
0
Francisco Puga