Подтвердить что ты не робот

Вагрант - как иметь определенные шаги по созданию платформы для конкретной платформы

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

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

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

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

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

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

Спасибо заранее.

4b9b3361

Ответ 1

Узнайте текущую ОС внутри 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

Изменить: не хватало? on если условие.

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

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

Execute:

# Ran provision to call Vagrantfile.
$ vagrant provision
is_windows_host: false
Vagrant launched from mac.

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

Когда я читаю оригинальный вопрос по моему мнению, дело не в том, как выяснить, в какой ОС он работает, а в какой ОС есть виртуальные машины, которые нужно подготовить. Вот почему вы хотите запустить другой сценарий предоставления, в зависимости от различных ОС новых виртуальных машин, например: "/vagrant/provisioning/only_run_this_on_$ndomOS_OF_NEW_VM‹.sh".

К сожалению, Vagrant не имеет этой возможности (пока), так что это мое решение: я определяю свои виртуальные машины поверх моего файла vagrant:

   cluster = {
  "control.ansible.RHEL76" => { :ip => "192.168.1.31", :type => 0, :cpus => 1, :mem => 1024, :box_image => "centos/7" },
  "app01.ansible.RHEL76"   => { :ip => "192.168.1.32", :type => 1, :cpus => 1, :mem => 1024, :box_image => "centos/7" },
  "app02.ansible.RHEL76"   => { :ip => "192.168.1.33", :type => 1, :cpus => 1, :mem => 1024, :box_image => "centos/7" },
  "winserver"          => { :ip => "192.168.1.34", :type => 2, :cpus => 1, :mem => 1024, :box_image => "mwrock/Windows2016" },
}

Тогда эти условия в моем коде могут обеспечивать различные способы в зависимости от ОС виртуальной машины:

if "#{info[:box_image]}" == "mwrock/Windows2016" then
  puts "is_windows_host: #{info[:box_image]}"
  config.vm.provision : shell, inline => "/vagrant/provisioning/only_run_this_on_windows.psl"
end
if "#{info[:box_image]}" == "centos/7" then
  puts "is_linux_host: #{info[:box_image]}"
  config.vm.provision : shell, inline => "/vagrant/provisioning/only_run_this_on_linux.sh"
end

Кстати, только на ansible контроллере должен быть установлен ansible, потому что в реальной жизни (да в офисе) я использую не vagrant, а ansible контроллер, который я тоже хочу в своей лаборатории (OK Virtual Box на обеих моих Windows 10 десктопов, а также мой ноутбук Ubuntu). Я использую условие для проверки "type = 0" (которое я использую для ответного "контроллера"). Только ansible контроллер запускает ansible_local для предоставления кластеру виртуальных машин ansible.

   if info[:type]  == 0 then
     cfg.vm.provision "shell", inline: "if [ 'which ansible' ] ; then echo \"ansible available\"; else sudo  yum -y update; sudo yum -y install epel-release; sudo yum -y install ansible; fi"
     cfg.vm.provision "ansible_local" do |ansible|
        ansible.extra_vars = { ansible_ssh_user: 'vagrant' }
        ansible.inventory_path = "./production"
        ansible.playbook = "rhelhosts.yml"
        ansible.limit = "local"
     end # ansible_local

Это отображается во время бродячей заготовки:

PS D:\Documents\vagrant\top> контроль над бродячим предоставлением .top.RHEL76 is_linux_host: centos/7 is_linux_host: centos/7 is_linux_host: centos/7 is_windows_host: mwrock/Windows2016

Это отображается во время бродячей подготовки:

PS D:\Documents\vagrant\ansible> vagrant provision control.ansible.RHEL76

is_linux_host: centos/7

is_linux_host: centos/7

is_linux_host: centos/7

is_windows_host: mwrock/Windows2016

--- many more lines, not relevant ---

Получайте удовольствие от экспериментов и развертывания своих лабораторий с несколькими машинами и несколькими ОС!