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.
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"]
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"]
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.
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.
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"
[ ... ]