2014-10-08 4 views
3

vagrant-hostsupdater를 사용하여 VM을 가리키는 호스트의/etc/hosts 파일에 항목을 추가하는 방법을 알고 있지만 실제로 시도하고 있습니다. 다른 방향으로가는 역동적 인 길을 찾는다. 내 컴퓨터에는 MySQL에 큰 db가 설치되어 있습니다. 이것을 VM 내부에 넣고 싶지 않습니다. VM에 액세스 할 수 있어야합니다.Vagrant와 Puphpet를 사용하여 호스트 컴퓨터를 가리키는 VM/etc/host 항목 추가

나는 수동으로 쉽게 설정할 수 있습니다. 방황 한 후에는 VM에 ssh를 넣고/etc/hosts 파일을 편집하여 hostmachine.local과 같은 항목을 만들고 그 시점에 내 IP 주소를 가리킬 수 있습니다. 그러나 집에서 직장으로 이동하면 호스트 컴퓨터가 변경되어 계속해서 항목을 업데이트해야합니다.

.erb 파일 내에 방법이 있거나 호스트 시스템의 IP를 가져 와서 VM 호스트 파일에 해당 항목을 만드는 방법이 있습니까?

답변

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 

주 : 추가 유지합니다 /etc/hosts에 부가 echo | tee -a 명령 경우 (VM을 파괴하지 않고) 프로비저닝 여러 번. 거기에 더 나은 솔루션이 필요할 수도 있습니다.

0

실제로 Mac에서 VM을 실행하고 내 local.db.yml 파일이 소스 코드에 포함되어 있지 않은 상황에서 좀 더 간단한 해결책을 발견했습니다. 이름/IP를 사용하는 대신 실제로 Mac의 시스템 환경 설정으로 이동하여 내 컴퓨터의 로컬 네트워크 이름 (예 : Kris-White-Mac.local)을 찾을 수있었습니다.

이 정보는 VM의 내부와 외부를 모두 해결합니다. 그래서 localhost 나 127.0.0.1 대신 그 이름을 넣으면 내 IP가 변경 되더라도 작동합니다.

0

또 다른 가능한 해결책은 vagrant-hosts plugin을 사용하는 것입니다. 호스트 IP는 BrianC가 대답 한 것과 같은 방법으로 찾을 수 있습니다.

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 

제공자가 host.machine에 VM의 /etc/hosts 파일, 매핑 호스트 컴퓨터의 IP 주소에 행을 추가합니다. 프로비저를 여러 번 실행해도 /etc/hosts에 중복 행이 생기지는 않습니다.