Вагрант - как иметь определенные шаги по созданию платформы для конкретной платформы
У нас есть разнообразная команда разработчиков, одна на 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
.
.
Спасибо заранее.
Ответы
Ответ 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 ---
Получайте удовольствие от экспериментов и развертывания своих лабораторий с несколькими машинами и несколькими ОС!