添加指向具有Vagrant和Puphpet的主机的VM / etc / host条目

时间:2014-10-08 14:59:38

标签: vagrant puphpet

我知道如何使用vagrant-hostsupdater将条目添加到指向VM的主机/ etc / hosts文件中,但我实际上是想找到一种动态的方法来转向其他方向。在我的机器上,我安装了一个带有大型数据库的MySQL。我不想把它放在虚拟机中,我需要虚拟机才能访问它。

我可以轻松手动设置。在流浪之后,我可以进入虚拟机并在那里编辑/ etc / hosts并创建一个类似hostmachine.local的条目,然后指向我的IP地址。但是,当我从家到工作时,我的主机将会改变,因此我不断更新该条目。

在.erb文件中是否存在某种方式或以某种方式使流浪者获取主机的IP并在VM主机文件中进行此类输入?

3 个答案:

答案 0 :(得分:2)

这是一种方法。由于Vagrantfile是一个Ruby脚本,我们可以使用一些逻辑来查找本地主机名和IP地址。然后我们在一个简单的配置脚本中使用它们,将它们添加到访客/etc/hosts文件。

示例Vargrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

# test setting the host IP address into the guest /etc/hosts

# determine host IP address - may need some other magic here
# (ref: http://stackoverflow.com/questions/5029427/ruby-get-local-ip-nix)
require 'socket'
def my_first_private_ipv4
  Socket.ip_address_list.detect{|intf| intf.ipv4_private?}
end
ip = my_first_private_ipv4.ip_address()

# determine host name - may need some other magic here
hostname = `hostname`

script = <<SCRIPT
echo "#{ip} #{hostname}" | tee -a /etc/hosts
SCRIPT

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "hashicorp/precise64"
  config.vm.hostname = "iptest"
  config.vm.provision :shell, :inline => script
  config.vm.provider "virtualbox" do |vb|
  #   vb.gui = true
     vb.name = "iptest"
     vb.customize ["modifyvm", :id, "--memory", "1000"]
  end
end

注意:如果您多次配置(不破坏VM),添加到echo | tee -a的{​​{1}}命令将继续追加。如果遇到这种情况,你可能需要一个更好的解决方案。

答案 1 :(得分:0)

我实际上根据我的情况找到了一个更简单的解决方案,在Mac上运行VM以及我的local.db.yml文件不是源代码的一部分。我没有使用名称/ IP,而是实际上只能访问Mac的系统偏好设置并找到我的计算机的本地网络名称,即Kris-White-Mac.local

这解决了VM内部和外部的问题,因此通过将该名称替换为localhost或127.0.0.1,即使我的IP发生更改也能正常工作。

答案 2 :(得分:0)

另一种可能的解决方案是使用vagrant-hosts plugin。可以像BrianC在答案中看到的那样找到主机IP。

Vagrantfile:

# -*- mode: ruby -*-
# vi: set ft=ruby :

require 'socket'

def my_first_private_ipv4
  Socket.ip_address_list.detect{|intf| intf.ipv4_private?}
end
host_ip = my_first_private_ipv4.ip_address()

Vagrant.configure(2) do |config|
    config.vm.define "web", primary: true do |a|
        a.vm.box = "ubuntu/trusty64"
        a.vm.hostname = "web.local"

        a.vm.provider "virtualbox" do |vb|
          vb.memory = 2048
          vb.cpus = 1
        end

        a.vm.provision :hosts do |provisioner|
            provisioner.add_host host_ip, ['host.machine']
        end
    end
end

Provisioner将向VM的/etc/hosts文件添加一行,将主机的IP地址映射到host.machine。多次运行配置程序不会导致/etc/hosts中的重复行。