it-swarm.com.ru

Vagrant - как выполнить шаги по настройке хост-платформы

У нас есть разнообразная команда разработчиков, одна для Windows, другая для Ubuntu и другая для OSX. Будучи Windows-парнем, я установил первую версию скрипта установки vagrant, которая работает потрясающе;)

Однако, когда он запускается на хосте Ubuntu, при первом обращении к шагу инициализации, который вызывает скрипт bash, происходит сбой из-за разрешений.

В Windows это не имеет значения, так как общий ресурс samba автоматически имеет достаточные разрешения для запуска сценария bash (который находится в иерархии проекта, поэтому присутствует в общем каталоге/vagrant на виртуальной машине), но в Ubuntu мне нужно установить разрешения на этот файл в сценарии предоставления, прежде чем я его вызываю.

Это не проблема, и, честно говоря, я подозреваю, что даже с дополнительным этапом «chmod» он все равно будет нормально работать под Windows, но есть ли способ в файле vagrant пометить определенные этапы подготовки как «Только для Windows», ' Только для Linux »или« Только для Mac »?

то есть в псевдо-коде, что-то вроде.

.
.
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
.
.

Заранее спасибо.

36
Steve Childs

Узнайте текущую ОС внутри Vagrantfile.

Добавьте это в ваш 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

Тогда вы можете использовать его как хотите.

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

Правка: не хватало? если при условии.

Пример, использованный для тестирования:

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

Выполнение:

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

Обратите внимание, что сам Vagrant в классе Vagrant :: Util :: Platform уже реализует более продвинутую версию логики проверки платформы в ответе by BernardoSilva .

Поэтому в Vagrantfile вы можете просто использовать следующее:

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

Вот версия, использующая утилиты Vagrant, которая проверяет Mac и Windows:

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