Vagrant virtualbox提供程序 - 在随后的“重新加载”中使用storagectl附加提供和自定义错误

时间:2015-05-27 18:51:39

标签: vagrant customization virtualbox vagrantfile

全部 - 我在MacOSX 10.9.5上使用Vagrant和VirtualBox提供程序设置多机环境。

问题:我需要将SATA存储控制器连接到CentOS 7.1来宾VM以添加额外的vHDD。我使用以下customize代码段执行此操作:

  config.vm.define vmName = hostname do |node|
    ...snip...
    node.vm.provider "virtualbox" do |v|
      v.customize ['storagectl', :id, '--name', 'SATA Controller', '--add', 'sata'] 
      ...

这在vagrant up上完全正常 - 连接了SATA控制器,随后我可以createhdstorageattach。但是 - 当我执行vagrant reload时,正在运行customize - 导致失败错误情况:

Stderr: VBoxManage: error: Storage controller named 'SATA Controller' already exists 
VBoxManage: error: Details: code VBOX_E_OBJECT_IN_USE (0x80bb000c), component SessionMachine, interface IMachine, callee nsISupports     
VBoxManage: error: Context: "AddStorageController(Bstr(pszCtl).raw(), StorageBus_SATA, ctl.asOutParam())" at line 1044 of file VBoxManageStorageController.cpp

版本:

Vagrant version: 1.7.2 
VirtualBox version: 4.3.28r100309

如果我在运行storagectl之前注释掉vagrant reload命令,则重新加载成功,并且没有问题,因为未附加额外的控制器。但是 - 这不是一个可持续的解决方案。

Vagrantfile是否有一些我还无法挖掘的选项 - 强制它不执行customize步骤?或者,这可能是VirtualBox Vagrant提供程序中的一个错误,它重新运行customize步骤,而不应该这样做?

~~ shane

完整参考 - 这是我的完整Vagrantfile(请参阅下面的“警告”评论,了解自定义问题):

# vi: set ft=ruby :

###
#  set 'num_minions' to the number of minions you'd like built
#  set 'num_disks' to the number of disks to build on the minion
#  set 'disk_size' to the MB size of the disks to build for the minions
###
num_minions = 5                   # number of minions to build
num_disks = 12                    # number of vHDDs to attach to minions
disk_size = 256                   # size (MB) of each disk to attach to minions
name_prefix = "minion"            # minion name prefix to use
cur_dir = Dir.pwd
disks_dir = "#{cur_dir}/disks"    # set the storage location for minion disks
int_net1 = "172.16.1"             # internal net 1: first 3 octets of IP space
                                  # NOTE "configs/minion" needs to be updated to
                                  # match "master" IP set below - otherwise salt
                                  # will not work

Vagrant.configure("2") do |config|
  config.vm.box = "centos71"

  config.vm.provider "virtualbox" do |v|
    v.memory = 1024
  end

  config.vm.define "master-01", primary: true do |node|
    node.vm.hostname = "master-01"
    node.vm.network :private_network, ip: "#{int_net1}.10"
    node.vm.provision "shell", inline: "echo master-01 IP set to #{int_net1}.10"
    node.vm.synced_folder "~/cpelab/ceph-salt/salt/", "/srv/salt"
    node.vm.synced_folder "~/cpelab/ceph-salt/pillar/", "/srv/pillar"

    node.vm.provision :salt do |salt|
      salt.install_master = true
      salt.master_config = "configs/master"
      salt.run_highstate = false
      salt.master_key = 'keys/master-01.pem'
      salt.master_pub = 'keys/master-01.pub'
      salt.minion_config = "configs/minion"
      salt.minion_key = 'keys/master-01.pem'
      salt.minion_pub = 'keys/master-01.pub'

      salt.seed_master = { 'dash-01' => 'keys/dash-01.pub', 'master' => 'keys/master-01.pub' }
      (1..num_minions).each do |v|
        vn = "#{name_prefix}-%03d" % v
        salt.seed_master = { "#{vn}" => "keys/#{vn}.pub" }
      end

    end
  end

#  MINIONS with additional disk devices
  (1..num_minions).each do |i|
    hostname = "#{name_prefix}-%03d" % i
    minion_ip = (i.to_i + 100)
    config.vm.define vmName = hostname do |node|
      node.vm.hostname = vmName
      node.vm.network :private_network, ip: "#{int_net1}.#{minion_ip}"
      node.vm.provision "shell", inline: "echo #{vmName} IP set to #{int_net1}.#{minion_ip}"

      node.vm.provider "virtualbox" do |v|
############# WARNING
############# WARNING: can't "vagrant reload" - as the 'customize' snippet is
############# WARNING: re-run on reload, and you can't inject a new controller
############# WARNING: of the same type seems to be a bug in the specific
############# WARNING: provider for vagrant or my usage???
############# WARNING
        v.customize ['storagectl', :id, '--name', 'SATA Controller', '--add', 'sata']

        (1..num_disks).each do |disk|
          diskname = File.expand_path("#{disks_dir}/#{vmName}-#{disk}.vdi")
          v.customize ['createhd', '--filename', diskname, '--size', "#{disk_size}"]
          v.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', disk, '--device', 0, '--type', 'hdd', '--medium', diskname]
        end
      end

      node.vm.provision :salt do |salt|
        salt.minion_config = "configs/minion"
        salt.minion_key = "keys/#{vmName}.pem"
        salt.minion_pub = "keys/#{vmName}.pub"
      end
    end
  end

# setup Dashing web dashboard
  config.vm.define "dash-01" do |node|
    node.vm.hostname = "dash-01"
    node.vm.network :private_network, ip: "#{int_net1}.11"
    node.vm.provision "shell", inline: "echo dash-01 IP set to #{int_net1}.11"
    node.vm.network "forwarded_port", guest: 80, host: 8080
    node.vm.provision "shell", inline: "echo dash-01 port 80 forwarding: http://127.0.0.1:8080"
    node.vm.synced_folder "~/cpelab/ceph-salt/salt/", "/srv/salt"
    node.vm.synced_folder "~/cpelab/ceph-salt/pillar/", "/srv/pillar"

    node.vm.provision :salt do |salt|
      salt.minion_config = "configs/minion"
      salt.minion_key = 'keys/dash-01.pem'
      salt.minion_pub = 'keys/dash-01.pub'
    end
  end
end

0 个答案:

没有答案