多个虚拟虚拟机是否可以通过虚拟机主机名进行通信



我正在使用Vagrant管理多个VM。网络配置为专用,已设置 IP 地址并分配主机名。如下面的流浪者文件所示。

虚拟机可以通过 IP 地址相互通信,但我想知道如何允许虚拟机使用其分配的主机名进行通信。 即如何使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

用 https://github.com/adrienthebo/vagrant-hosts 欺骗 DNS 解析?

您可以使用 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

这不是世界上最优雅的解决方案,但它非常简单,像这样的事情怎么样:

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

如果主机正确解析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 }}"

查看 Github 上的 landrush。它将为您的流浪专用网络设置 DNS。

最新更新