在Vagrant中为多个环境计算机创建两个磁盘

我将用Vagrant创建一个多环境机器。 这是我正在尝试配置的VagrantFile。 我想实例化七台机器通过专用网络连接它们。 每一个都应该有两个磁盘。 我在Vagrant文​​档中找到了暴露createhd命令的VBoxManage。 我不知道我应该在哪里放置这个命令。 在每个机器块内部或内部虚拟提供程序块配置?

 Vagrant.configure(2) do |config| config.vm.provision "shell", inline: "echo OpenStack" config.vm.box = "ubuntu/trusty64" config.vm.provider "virtualbox" do |vb| vb.customize ["modifyvm", :id, "--memory", "2048", "--cpus", "1"] end config.vm.define "machine1" do |machine1| machine1.vm.hostname = "machine1" machine1.vm.provider "virtualbox" do |vb| vb.customize ["createhd", "--filename", "machine1_disk0", "--size", "4096"] vb.customize ["createhd", "--filename", "machine1_disk1", "--size", "4096"] vb.customize ["storagectl", :id, "--name", "SATA Controller", "--add", "sata"] vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", "1", "--type", "hdd", "--medium", "machine1_disk0.vdi"] vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", "2", "--type", "hdd", "--medium", "machine1_disk1.vdi"] end machine1.vm.network "private_network", ip: "192.168.10.10" machine1.vm.network "private_network", ip: "192.168.10.15" end config.vm.define "machine2" do |machine2| machine2.vm.hostname = "machine2" machine2.vm.provider "virtualbox" do |vb| vb.customize ["createhd", "--filename", "machine2_disk0", "--size", "4096"] vb.customize ["createhd", "--filename", "machine2_disk1", "--size", "4096"] vb.customize ["storagectl", :id, "--name", "SATA Controller", "--add", "sata"] vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", "1", "--type", "hdd", "--medium", "machine2_disk0.vdi"] vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", "2", "--type", "hdd", "--medium", "machine2_disk1.vdi"] end machine2.vm.network "private_network", ip: "192.168.10.20" machine2.vm.network "private_network", ip: "192.168.10.25" end config.vm.define "machine3" do |machine3| machine3.vm.hostname = "machine3" machine3.vm.provider "virtualbox" do |vb| vb.customize ["createhd", "--filename", "machine3_disk0", "--size", "4096"] vb.customize ["createhd", "--filename", "machine3_disk1", "--size", "4096"] vb.customize ["storagectl", :id, "--name", "SATA Controller", "--add", "sata"] vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", "1", "--type", "hdd", "--medium", "machine3_disk0.vdi"] vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", "2", "--type", "hdd", "--medium", "machine3_disk1.vdi"] end machine3.vm.network "private_network", ip: "192.168.10.30" end config.vm.define "machine4" do |machine4| machine4.vm.hostname = "machine4" machine4.vm.provider "virtualbox" do |vb| vb.customize ["createhd", "--filename", "machine4_disk0", "--size", "4096"] vb.customize ["createhd", "--filename", "machine4_disk1", "--size", "4096"] vb.customize ["storagectl", :id, "--name", "SATA Controller", "--add", "sata"] vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", "1", "--type", "hdd", "--medium", "machine4_disk0.vdi"] vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", "2", "--type", "hdd", "--medium", "machine4_disk1.vdi"] end machine4.vm.network "private_network", ip: "192.168.10.40" end config.vm.define "machine5" do |machine5| machine5.vm.hostname = "machine5" machine5.vm.provider "virtualbox" do |vb| vb.customize ["createhd", "--filename", "machine5_disk0", "--size", "4096"] vb.customize ["createhd", "--filename", "machine5_disk1", "--size", "4096"] vb.customize ["storagectl", :id, "--name", "SATA Controller", "--add", "sata"] vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", "1", "--type", "hdd", "--medium", "machine5_disk0.vdi"] vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", "2", "--type", "hdd", "--medium", "machine5_disk1.vdi"] end machine5.vm.network "private_network", ip: "192.168.10.50" end config.vm.define "machine6" do |machine6| machine6.vm.hostname = "machine6" machine6.vm.provider "virtualbox" do |vb| vb.customize ["createhd", "--filename", "machine6_disk0", "--size", "4096"] vb.customize ["createhd", "--filename", "machine6_disk1", "--size", "4096"] vb.customize ["storagectl", :id, "--name", "SATA Controller", "--add", "sata"] vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", "1", "--type", "hdd", "--medium", "machine6_disk0.vdi"] vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", "2", "--type", "hdd", "--medium", "machine6_disk1.vdi"] end machine6.vm.network "private_network", ip: "192.168.10.60" end config.vm.define "machine7" do |machine7| machine7.vm.hostname = "machine7" machine7.vm.provider "virtualbox" do |vb| vb.customize ["createhd", "--filename", "machine7_disk0", "--size", "4096"] vb.customize ["createhd", "--filename", "machine7_disk1", "--size", "4096"] vb.customize ["storagectl", :id, "--name", "SATA Controller", "--add", "sata"] vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", "1", "--type", "hdd", "--medium", "machine7_disk0.vdi"] vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", "2", "--type", "hdd", "--medium", "machine7_disk1.vdi"] end machine7.vm.network "private_network", ip: "192.168.10.70" end 

结束

首先,必须将自定义(如createhd添加到提供程序。 如果将其添加到配置提供程序

 config.vm.provider "virtualbox" do |vb| config.vm.customize ['createhd', '--filename', file_to_disk, '--size', some_size] config.vm.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', file_to_disk] end 

它将在全球范围内定义,并且所有机器都将使用这些参数。 (不确定)结果只会创建一个磁盘,并将在定义的计算机之间共享。

我认为你应该在每台机器上定义提供者。 例如

 config.vm.define "machine4" do |machine4| machine4.vm.network "private_network", ip: "192.168.10.40" machine4.vm.provider :virtualbox do |vb| vb.customize ["createhd", "--filename", "m4_disk0", "--size", "2048"] vb.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", "1", "--type", "hdd", "--medium", "m4_disk0.vdi"] end end 

请将此Vagrantfile视为参考。

好吧,你真的希望它只创建和附加额外的存储一次。 我相信上面接受的答案将导致后续运行出错,因为.VDI文件已经创建( 并且已经附加)。

这样做的方法是使用File.exist?测试VDI文件是否在主机磁盘上File.exist? ,这意味着它已经被创建了。

对于多机器,这可能是您想要的:

 (1..3).each do |i| config.vm.define "node-#{i}" do |node| node.vm.network "private_network", ip: "192.168.200.#{i}" file_for_disk = "./large_disk#{i}.vdi" node.vm.provider "virtualbox" do |v| unless File.exist?(file_for_disk) v.customize ['createhd', '--filename', file_for_disk, '--size', 80 * 1024] v.customize ['storageattach', :id, '--storagectl', 'SATAController', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', file_for_disk] end end end end 

“这对我有用。” “我以为我分享这个,因为它可能会帮助像我这样的流浪汉新手。”

 Vagrant.configure("2") do |config| file_to_disk = '../second_disk.vdi' # create CrushFTP nodes (1..2).each do |i| config.vm.define "cftpnode#{i}" do |node| node.vm.customize ['createhd', '--filename', file_to_disk, '--size', 500 * 1024] node.vm.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', file_to_disk] node.vm.box = "bento/centos-7.2" node.vm.hostname = "cftpnode#{i}" node.vm.network :private_network, ip: "192.168.0.1#{i}" node.vm.provider "virtualbox" do |vb| vb.memory = "1024" end node.vm.provision :shell, path: "bootstrap-node.sh" end end end