Mikhail R
Mikhail R

Reputation: 421

Optimise Vagrant file code with loop

I have vagrant file which gives me ability to run Win 7 and Win 8 OS inside VirtualBox

 Vagrant.configure("2") do |config|
  # Win7 VM
  config.vm.define "win7" do |win7|
    win7.vm.box_url = "file:///C:/V_W_S/windows_7_virtualbox.box"
    win7.vm.box = "windows_7_virtualbox"
    win7.vm.communicator = "winrm"  
    win7.vm.boot_timeout = 600
    win7.vm.graceful_halt_timeout = 600
    win7.vm.network "public_network", auto_config: true
  win7.vm.provider "virtualbox" do |vb|
       vb.customize ["modifyvm", :id, "--usb", "on"]
       vb.customize ["modifyvm", :id, "--usbehci", "on"]
       vb.customize ["modifyvm", :id, "--accelerate3d", "on"]       
       vb.customize ['usbfilter', 'add', '0', '--target', :id, '--name', 'SmartCard', '--vendorid', '0x096E', '--productid', '0x0007']
       vb.customize ["modifyvm", :id, "--memory", "4096"]
       vb.customize ["modifyvm", :id, "--vram", "256"]
       vb.cpus = 2
       vb.gui = true
       vb.name = "Win_7_x64_Mult"
end
end
  # Windows 8 VM
  config.vm.define "win8" do |win8|
    win8.vm.box_url = "file:///C:/V_W_S/Windows8_x64.box"
    win8.vm.box = "Windows8_x64"
    win8.vm.communicator = "winrm"  
    win8.vm.boot_timeout = 600
    win8.vm.graceful_halt_timeout = 600
    win8.vm.network "public_network", auto_config: true
  win8.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--usb", "on"]
    vb.customize ["modifyvm", :id, "--usbehci", "on"]
    vb.customize ["modifyvm", :id, "--accelerate3d", "on"]       
    vb.customize ['usbfilter', 'add', '0', '--target', :id, '--name', 'SmartCard', '--vendorid', '0x096E', '--productid', '0x0007']
    vb.customize ["modifyvm", :id, "--memory", "4096"]
    vb.customize ["modifyvm", :id, "--vram", "256"]
    vb.cpus = 2
    vb.gui = true
    vb.name = "Win_8_x64_Mult"
end
end
end

But I would like to use loop to minimize amount of code. For example in my vagrant file configvalues are the same. Distinctions are win.vm.define value, win.vm.box & win7.vm.box_url values. How can I squeeze amount of Vagrantfile?

Upvotes: 2

Views: 883

Answers (1)

Frederic Henri
Frederic Henri

Reputation: 53793

I would do something like this

Vagrant.configure("2") do |config|

  config.vm.communicator = "winrm" 
  config.vm.boot_timeout = 600
  config.vm.graceful_halt_timeout = 600
  config.vm.network "public_network", auto_config: true

  # Win7 VM
  config.vm.define "win7" do |win7|
    win7.vm.box_url = "file:///C:/V_W_S/windows_7_virtualbox.box"
    win7.vm.box = "windows_7_virtualbox"
    configure_provider(win7, "Win_7_x64_Mult")
  end

  # Windows 8 VM
  config.vm.define "win8" do |win8|
    win8.vm.box_url = "file:///C:/V_W_S/Windows8_x64.box"
    win8.vm.box = "Windows8_x64"
    configure_provider(win8, "Win_8_x64_Mult")
  end

end

def configure_provider (node, node_name)
  node.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--usb", "on"]
    vb.customize ["modifyvm", :id, "--usbehci", "on"]
    vb.customize ["modifyvm", :id, "--accelerate3d", "on"]       
    vb.customize ['usbfilter', 'add', '0', '--target', :id, '--name', 'SmartCard', '--vendorid', '0x096E', '--productid', '0x0007']
    vb.customize ["modifyvm", :id, "--memory", "4096"]
    vb.customize ["modifyvm", :id, "--vram", "256"]
    vb.cpus = 2
    vb.gui = true
    vb.name = node_name
  end
end

Upvotes: 3

Related Questions