web-dev-qa-db-fra.com

Vagrant - Comment avoir des étapes de provisioning spécifiques à la plateforme hôte

Nous avons une équipe de développeurs diversifiée, une sur Windows, une autre sur Ubuntu et une autre sur OSX. En tant que windows boy, j’ai installé la première version du script de configuration vagrant qui fonctionne à merveille;)

Cependant, lors de son exécution sur l'hôte Ubuntu, la première fois qu'une étape de provision appelle un script bash, elle échoue à cause d'autorisations.

Sous Windows, cela n'a pas d'importance, car le partage samba a automatiquement les autorisations suffisantes pour exécuter le script bash (qui réside dans la hiérarchie du projet, il est donc présent dans le partage/vagrant sur la machine virtuelle), mais avec ubuntu, je dois définir la les autorisations sur ce fichier dans le script de provision avant que je l'appelle.

Ce n’est pas le problème et, pour être honnête, je suppose que même avec l’étape supplémentaire "chmod", cela fonctionnerait toujours correctement sous Windows, mais existe-t-il un moyen dans le fichier errant de signaler certaines étapes de provisioning comme "Windows uniquement", " Linux uniquement »ou« Mac uniquement »?

c'est-à-dire dans le code pseduo, quelque chose comme.

.
.
if (Host == windows) then
  config.vm.provision : Shell, : inline => "/vagrant/provisioning/only_run_this_on_windows.sh"
else if (Host == linux) then
  config.vm.provision : Shell, : inline => "/vagrant/provisioning/only_run_this_on_linux.sh"
else if (Host == osx) then
  config.vm.provision : Shell, : inline => "/vagrant/provisioning/only_run_this_on_osx.sh"
end if
.
.

Merci d'avance.

36
Steve Childs

Découvrez le système d'exploitation actuel dans Vagrantfile.

Ajoutez ceci dans votre Vagrantfile:

module OS
    def OS.windows?
        (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ Ruby_PLATFORM) != nil
    end

    def OS.mac?
        (/darwin/ =~ Ruby_PLATFORM) != nil
    end

    def OS.unix?
        !OS.windows?
    end

    def OS.linux?
        OS.unix? and not OS.mac?
    end
end

Ensuite, vous pouvez l'utiliser comme vous le souhaitez.

if OS.windows? [then]
    code...
end

Edit: il manquait le? sur si condition.

Exemple utilisé pour tester:

is_windows_Host = "#{OS.windows?}"
puts "is_windows_Host: #{OS.windows?}"
if OS.windows?
    puts "Vagrant launched from windows."
elsif OS.mac?
    puts "Vagrant launched from mac."
elsif OS.unix?
    puts "Vagrant launched from unix."
elsif OS.linux?
    puts "Vagrant launched from linux."
else
    puts "Vagrant launched from unknown platform."
end

Exécuter:

# Ran provision to call Vagrantfile.
$ vagrant provision
is_windows_Host: false
Vagrant launched from mac.
42
Bernardo Silva

Notez que Vagrant lui-même, dans la classe Vagrant :: Util :: Platform implémente déjà une version plus avancée de la logique de vérification de la plateforme dans the answer by BernardoSilva .

Ainsi, dans un fichier Vagrant, vous pouvez simplement utiliser les éléments suivants:

if Vagrant::Util::Platform.windows? then
    myHomeDir = ENV["USERPROFILE"]
else
    myHomeDir = "~"
end
51
Tomas Creemers

Voici une version utilisant les utils Vagrant qui vérifie mac et windows:

if Vagrant::Util::Platform.windows?
    # is windows
elseif Vagrant::Util::Platform.mac?
    # is mac
else
    # is linux
end
0
Felix Eve