Ruby Vagrant 网络配置重复问题,一些对象引用问题

Ruby Vagrant network configuration duplication trouble, some objects references issue

我会马上说 - 例如,我在 Python 方面有经验,但 Ruby 对我来说是全新的所以这个问题可能与 Vagrant 完全无关,我不知道不知道,抱歉。

我想在我的主机上创建两个虚拟机并创建了 Vagrantfile:

Vagrant.configure("2") do |config|
    # Image config
    config.vm.box = "ubuntu/bionic64"
    config.disksize.size = '40GB'

    # Nodes specific configs
    config.vm.define "node_1_1" do |node|
        node.vm.network "public_network", ip: "192.168.3.11", bridge: "enp4s0", netmask: "255.255.248.0"
        node.vm.hostname = "vm-ci-node-1-1"
    end

    config.vm.define "node_1_2" do |node|
        node.vm.network "public_network", ip: "192.168.3.12", bridge: "enp4s0", netmask: "255.255.248.0"
        node.vm.hostname = "vm-ci-node-1-2"
    end

    # Nodes generic configs
    config.vm.provider "virtualbox" do |vb|
        vb.memory = "2048"
        vb.cpus=2
    end
end

它工作正常。

然后我决定删除参数硬编码并针对下一个具有两个以上 VM 的情况以及在具有另一个网桥接口名称的另一台机器上正确工作对其进行优化。所以我将 Nodes specific configs 部分替换为:

    target_interface = nil
    for if_addr in Socket.getifaddrs
        if if_addr.addr.ipv4? and if_addr.addr.ip_address.include? '192.168'
            target_interface = if_addr.name
        end
    end

    hostindex = 8
    guestindices = [1, 2]
    # Nodes specific configs
    for guestindex in guestindices
        vm_code = 'node_' + hostindex.to_s() + '_' + guestindex.to_s()
        ip = '192.168.3.' + hostindex.to_s() + guestindex.to_s()
        hostname = 'vm-ci-node-' + hostindex.to_s() + '-' + guestindex.to_s()
        config.vm.define vm_code.dup do |node|
            node.vm.network "public_network", ip: ip.dup, bridge: target_interface, netmask: "255.255.248.0"
            node.vm.hostname = hostname.dup
        end
    end

然后我 运行 vagrant up - 没有错误,但如果我尝试通过 SSH 连接到这两台机器 - 我会出现奇怪的行为:

  1. node_8_1 IP 地址是 192.168.3.82,主机名 - vm-ci-node-8-2
  2. node_8_2 IP 地址是 192.168.3.82,主机名 - vm-ci-node-8-2

如您所见 - 是一样的。还有另一个具有相同 IP 10.0.2.15 的接口 - 这也很麻烦,但它也存在于以前版本的配置中。

我怀疑有一些 Ruby 引用问题,所以我使用了 dup(我再说一遍,我是 Ruby 的新手,抱歉)。但是好像不行。

VM 代码不同 - node_8_1node_8_2,但 IP 和主机名相同。

谁能指出我错在哪里?

我认为 for guestindex in guestindices 部分是您遇到麻烦的原因。

尝试使用 guestindices.each do |i| 或更短的 (1..2).each do |i|

Vagrant 在他们的多机配置文档中提到了这一点,请参阅 https://www.vagrantup.com/docs/vagrantfile/tips.html#loop-over-vm-definitions:

The for i in ... construct in Ruby actually modifies the value of i for each iteration, rather than making a copy. Therefore, when you run this, every node will actually provision with the same [value].