Networking 多个流浪虚拟机能否通过虚拟机主机名进行通信?

Networking 多个流浪虚拟机能否通过虚拟机主机名进行通信?,networking,vagrant,Networking,Vagrant,我与Vagrant一起管理多个虚拟机。网络配置为专用,ip地址已设置,主机名已分配。如下面的文件所示 虚拟机可以通过IP地址相互通信,但我想知道如何允许虚拟机使用分配的主机名进行通信。也就是说,如何使ping comtest2从comtest1开始工作 流浪汉档案: Vagrant.configure("2") do |config| config.vm.define "comtest1" do |comtest1| comtest1.vm.box = "precise32"

我与Vagrant一起管理多个虚拟机。网络配置为专用,ip地址已设置,主机名已分配。如下面的文件所示

虚拟机可以通过IP地址相互通信,但我想知道如何允许虚拟机使用分配的主机名进行通信。也就是说,如何使
ping comtest2
comtest1
开始工作

流浪汉档案:

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

使用?

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

只需安装
avahi守护进程
libnss-mdns

例子
vagrant文件

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: 'apt-get install -y avahi-daemon libnss-mdns'

end
试验 退房。
它将为您的流浪者专用网络设置DNS。

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

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
Vagrant.configure(“2”)do | config|
config.vm.define“comtest1”do | comtest1|
comtest1.vm.box=“precise32”
comtest1.vm.hostname=“comtest1”
comtest1.vm.network“专用网络”,ip:“192.168.10.21”

comtest1.vm.provision“shell”,内联:如果主机正确解析DNS,则可以配置Virtualbox将主机用作DNS解析程序

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


我们使用本地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 }}"

难道不应该有一种更合法的方法来代替使用插件和“作弊”吗?我想知道这个限制是来自VM提供者还是Vagrant。这似乎有效,而且看起来是最简单的通信方式。如果使用它,
Vagrant文件的其余部分是什么样子的?(不是提供这些包,而是网络、机器命名等)没关系。我找到了答案,并添加了一个功能示例。虽然这在理论上可以回答这个问题,但在这里包含了答案的基本部分,并提供了供参考的链接。这似乎只适用于Linux主机。似乎对
iptables
有预请求。
- 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 }}"