Vagrant - 如何使主机平台特定的配置步骤

时间:2014-11-07 22:22:34

标签: ruby vagrant

我们有一个多元化的开发团队,一个在Windows上,另一个在Ubuntu上,另一个在OSX上。作为Windows男孩,我设置了流浪汉设置脚本的第一个版本,其工作非常棒;)

但是,在Ubuntu主机上运行它时,第一次进入调用bash脚本的供应步骤时,由于权限而失败。

在Windows上,这没关系,因为samba共享自动具有足够的权限来运行bash脚本(它位于项目层次结构中,因此存在于VM上的/ vagrant共享中),但是我需要ubuntu在我调用之前在配置脚本中设置此文件的权限。

这不是问题,说实话我怀疑即使使用额外的“chmod”步骤它仍然可以在windows下正常工作,但是,在vagrant文​​件中是否有一种方法可以将某些配置步骤标记为“仅限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
.
.

提前致谢。

4 个答案:

答案 0 :(得分:54)

请注意,the Vagrant::Util::Platform class中的Vagrant本身已经the answerBernardoSilva中实现了更高级版本的平台检查逻辑。

因此,在Vagrantfile中,您只需使用以下内容:

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

答案 1 :(得分:45)

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

答案 2 :(得分:3)

以下是使用Vagrant实用程序检查Mac和Windows的版本:

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

答案 3 :(得分:0)

当我阅读我的原始问题时,不是要找出它自己运行在哪个OS Vagrant上,而是要确定要配置的虚拟机有哪个OS。这就是为什么您要根据新VM的不同OS运行不同的配置脚本的原因,例如:“ / vagrant / provisioning / only_run_this_on _ $ {OS_OF_NEW_VM} .sh”。

不幸的是,Vagrant还没有此功能,所以这是我的解决方案:我在vagrant文​​件的顶部定义了VM:

   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" },
}

然后,我的代码中的这些条件可以根据VM的操作系统提供不同的方式:

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,因为在现实生活中(是办公室),我不使用无业游民,而是使用ansible控制器,这也是我在实验室中想要的(两个Windows上都可以使用Virtual Box) 10台式机以及我的Ubuntu笔记本电脑)。我使用一个条件来测试“类型= 0”(我将其用于响应的“控制器”)。只有ansible控制器才能启动ansible_local,以为VM群集配置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>流浪者提供control.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 ---

尝试和部署多机/多操作系统实验室很有趣!