Vagrant:在 Vagrant Up 上设置主机名一次

Vagrant: Set Hostname Once on Vagrant Up

我正在尝试使用 Vagrant 和 Chef-Client 配置来完成我正在处理的任务。我希望能够在使用 vagrant up 时生成唯一名称,将实例加入 Chef Server,然后在完成时删除节点。我主要是在工作;当我 运行 Chef Destroy 时,我卡在了从 Chef 服务器自动删除节点的问题上。我需要找到一种方法来缓存名称并稍后检索它,只有 运行 vagrant up 处的主机名配置,或者一些我还没有想出的选项。

我的 vagrantfile 片段如下:

Vagrant.configure('2') do |config|
  config.vm.box = 'centos/6'
  config.vm.hostname = "vagrant-#{SecureRandom.hex(2)}-el6.dev.local" 
  config.vm.provision 'chef_client' do |chef|
      chef.chef_server_url = 'https://chef.dev.local/organizations/foo'
      chef.add_role 'build_vm'
      chef.node_name = config.vm.hostname
      chef.delete_node = true
      chef.delete_client = true
  end
end

当这个 运行 位于 vagrant up 时,主机名设置为 vagrant-229b-el6.dev.local 但在销毁时它会尝试销毁 vagrant-3a1c-el6.dev.local。显然 运行 在每个 运行 上设置 config.vm.hostname 行,所以合乎逻辑的事情是不要让这种情况发生。我需要做什么才能让 vagrant up 创建的主机名保留下来,以便 Chef 知道稍后将其删除?

您不能仅使用 Vagrantfile 来执行此操作。我想,Vagrantfile 是在每个流浪者 运行 上读取的,所以每次它都会生成另一个随机名称。不过,您可以做的是首先 运行 将生成的主机名保存到环境变量或文件中,然后在接下来的 运行 秒从那里读取它,然后在 [=11] 删除文件或取消设置 env 变量=].

这可以通过 Vagrantfile 本身内部的简单 ruby 代码来完成,例如:

# We save the hostname into '.vagrant_hostname' file.
VAGRANT_HOSTNAME = '.vagrant_hostname'
if File.exist? VAGRANT_HOSTNAME
  hostname = IO.read( VAGRANT_HOSTNAME ).strip
else
  hostname = "vagrant-#{SecureRandom.hex(2)}-el6.dev.local"
  IO.write( VAGRANT_HOSTNAME, hostname )
end

Vagrant.configure('2') do |config|
  [...]      
  config.vm.hostname = hostname
  [...]
end

if <the command is "vagrant destroy">
  File.delele VAGRANT_HOSTNAME
end