【问题标题】:Can Multiple Vagrant VMs communicate by VM hostname?多个 Vagrant VM 可以通过 VM 主机名进行通信吗?
【发布时间】:2022-05-02 23:21:57
【问题描述】:

我正在使用 Vagrant 管理多个虚拟机。网络配置为私有网络,IP 地址已设置,主机名已分配。如下面的 Vagrantfile 所示。

虚拟机可以通过 IP 地址相互通信,但我想知道如何允许虚拟机使用分配的主机名进行通信。 IE。如何使ping comtest2comtest1 工作?

流浪文件:

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

  config.vm.define "comtest1" do |comtest1|
    comtest1.vm.box = "precise32"
    comtest1.vm.hostname = "comtest1"
    comtest1.vm.network "private_network", ip: "192.168.10.21"
  end

  config.vm.define "comtest2" do |comtest2|
    comtest2.vm.box = "precise32"
    comtest2.vm.hostname = "comtest2"
    comtest2.vm.network "private_network", ip: "192.168.10.22"
  end

end

【问题讨论】:

    标签: networking vagrant


    【解决方案1】:

    【讨论】:

    • 难道不应该有更合法的方式来代替使用插件和“作弊”吗?我想知道这个限制是来自 VM 提供者还是 Vagrant。
    • @neutrinus 答案是最简单的方法
    【解决方案2】:

    您可以使用 Zeroconf。它在网络中广播主机名,并使其可供本地网络上的其他主机使用。这样您就可以使用 test1.local、test2.local 等访问您的主机。

    只需安装avahi-daemonlibnss-mdns

    示例

    Vagrantfile:

    Vagrant.configure("2") do |config|
      
      config.vm.box = "ubuntu/bionic64"
      
      config.vm.define "vm1" do |machine|
        machine.vm.hostname = "vm1"
        machine.vm.network "private_network", type: "dhcp"
      end
    
      config.vm.define "vm2" do |machine|
        machine.vm.hostname = "vm2"
        machine.vm.network "private_network", type: "dhcp"
      end
      
      # allow guests to reach each other by hostname
      config.vm.provision "allow_guest_host_resolution",
        type: "shell",
        inline: <<-SHELL
          apt update
          apt install -y avahi-daemon libnss-mdns
        SHELL
        
    end
    

    测试

    $ vagrant up
    ...
    $ vagrant ssh vm1 -- ping -c 1 vm2.local
    PING vm2.local (172.28.128.8) 56(84) bytes of data.
    64 bytes from 172.28.128.8 (172.28.128.8): icmp_seq=1 ttl=64 time=0.333 ms
    
    $ vagrant ssh vm2 -- ping -c 1 vm1.local
    PING vm1.local (172.28.128.7) 56(84) bytes of data.
    64 bytes from 172.28.128.7 (172.28.128.7): icmp_seq=1 ttl=64 time=0.254 ms
    

    【讨论】:

    • 这似乎行得通,看起来是最简单的交流方式。
    • 如果使用它,Vagrantfile 的其余部分会是什么样子? (不是那些包的配置,而是网络、机器命名等)
    • 没关系。我想通了并添加了一个功能示例。
    • 虽然原则上这似乎是个好主意,但您的实际结果可能会有所不同。 mDNS 不适用于执行真正 NS 解析的应用程序,这通常是用 Go 编写的东西的情况。我在尝试设置 Prometheus 时特别遇到了这个问题,但发现 Docker 存在相同问题的实例。 (见:github.com/docker/machine/issues/3297
    【解决方案3】:

    这不是世界上最优雅的解决方案,但它非常简单,比如:

    Vagrant.configure("2") do |config|
    
      config.vm.define "comtest1" do |comtest1|
        comtest1.vm.box = "precise32"
        comtest1.vm.hostname = "comtest1"
        comtest1.vm.network "private_network", ip: "192.168.10.21"
        comtest1.vm.provision "shell", inline: <<-SHELL
           sed -i '$ a 192.168.10.22 comtest2' /etc/hosts           
        SHELL
      end
    
      config.vm.define "comtest2" do |comtest2|
        comtest2.vm.box = "precise32"
        comtest2.vm.hostname = "comtest2"
        comtest2.vm.network "private_network", ip: "192.168.10.22"
      end
    
    end
    

    【讨论】:

      【解决方案4】:

      如果主机正确解析 DNS,那么您可以将 Virtualbox 配置为使用主机作为 DNS 解析器。

      config.vm.provider :virtualbox do |vb|
        vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
      end
      

      https://serverfault.com/a/506206/250071


      我们使用本地 Ansible 任务自动将配置框添加到主机 /etc/hosts 文件中。有点尴尬,但一直很健壮。

      - setup:
        gather_subset: [network]
      - name: Add host mapping to local /etc/hosts
        delegate_to: 127.0.0.1
        lineinfile: dest=/etc/hosts regexp=".+{{ vm.hostname }}$" line="{{ ansible_all_ipv4_addresses|sort|last }} {{ vm.hostname }}"
      

      【讨论】:

        【解决方案5】:

        查看landrush on Github。 它将为您的 vagrant 专用网络设置 DNS。

        【讨论】:

        • 虽然这在理论上可以回答问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
        • 这似乎只适用于 Linux 主机。似乎有iptables 的前置要求。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 2021-12-12
        • 1970-01-01
        • 1970-01-01
        • 2014-08-08
        相关资源
        最近更新 更多