Reputation: 421
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 config
values 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
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
everything that is at config.
level applied for all your machines (read https://www.vagrantup.com/docs/multi-machine/)
Just define a ruby function to apply your provider settings
Upvotes: 3