vagrant 管理主机 dhcp

vagrant manage hosts dhcp

我想在每次 运行 vagrant up / vagrant destroy。有一些插件可以执行此操作但不支持 dhcp。

我正在使用 machine_name = File.basename(File.expand_path('..', Dir.pwd)) + '.local' 构建目录名。

我遗漏的另一个难题是在 Vagrantfile 中获取 VM 的 dhcp 分配 IP 地址并更新主机上的 /etc/hosts 文件的方法。

我的目标是在不编辑 Vagrantfile 和 /etc/hosts 中的名称 and/or IP 的情况下启动虚拟机。

我正在使用 Vagrant 1.7.4、VirtualBox 5.x 和 Puppet 4.2。

有什么想法吗?

你应该可以做到这一点。

还记得 vagrant 文件是 ruby 吗?编写一个配置 shell 脚本来设置 /etc/hosts 并将其作为参数传递到 Vagrant 文件中文件的位置(有点像上面的 File.exapand)。

这样当 vagrant 运行脚本时,它会生成参数,配置脚本会获取并使用它。

供参考:https://docs.vagrantup.com/v2/provisioning/shell.html

您应该可以为此目的使用 vagrant-dns,看起来它可以完成您想要实现的大部分目标(尽管正如 Mircea 所说,几乎所有事情都可以通过脚本完成)

文档给出了一个使用私有网络的示例,但您也可以使用以下配置

  config.vm.box = "ubuntu-12.04"

  config.dns.tld = "dev"
  config.vm.hostname = "test-machine"

  config.vm.network "public_network"
  config.vm.network "forwarded_port", guest: 80, host: 8080

安装 vagrant-dns 后 (运行 vagrant dns --install) 你将能够通过 www.test-machine.dev:8080[=13= 访问你的机器]

我已经安装了 vagrant-hostmanager,它有一个非常有用的 config.hostmanager.ip_resolver 选项。

将以下代码添加到您的 Vagrantfile 以确保您的 /etc/hosts 文件在您 运行 vagrant up 命令时更新:

config.vm.hostname = "add-name-here"

unless Vagrant.has_plugin?('vagrant-hostmanager')
    raise 'vagrant-hostmanager is not installed!'
else
    config.hostmanager.enabled = true
    config.hostmanager.manage_host = true
    config.hostmanager.ignore_private_ip = false
    config.hostmanager.include_offline = true
    config.hostmanager.ip_resolver = proc do |vm, resolving_vm|
        if hostname = (vm.ssh_info && vm.ssh_info[:host])
            `vagrant ssh -c "hostname -I"`.split()[1]
        end
    end
end

感谢:https://github.com/smdahlen/vagrant-hostmanager/issues/86#issuecomment-107052823