【问题标题】:Vagrant: Set Hostname Once on Vagrant UpVagrant:在 Vagrant Up 上设置一次主机名
【发布时间】:2017-05-04 20:39:00
【问题描述】:

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

我的 vagrantfile 的一个 sn-p 如下:

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 知道稍后将其删除?

【问题讨论】:

    标签: vagrant chef-infra vagrantfile vagrant-provision


    【解决方案1】:

    你不能只用 Vagrantfile 做到这一点。我认为,每次 vagrant 运行都会读取 Vagrantfile,因此每次它都会生成另一个随机名称。您可以做的是在第一次运行时将生成的主机名保存到环境变量或文件中,并在下次运行时从那里读取它,然后删除文件或取消设置 vagrant destroy 上的环境变量。

    这可以通过 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
    

    【讨论】:

    • 我认为您可以只依赖 vagrant 在创建 VM 时生成的 id 文件,该文件是 virtualbox/vmware VM Id,因此您不需要维护另一个文件。
    • 我已经很久没有和 vagrant 合作了。如果 vagrant 将主机名本身保存到某个文件中,那么使用该文件肯定是一个更干净的解决方案。
    • 嗯,需要详细说明 - 不,它不会保存主机名本身,但 vagrant 维护一个文件,其中包含它创建的 VM 的 ID(.vagrant 文件夹下的部分文件)所以我如果此文件存在,则会看到 OP 没有运行 config.vm.hostname = "vagrant-#{SecureRandom.hex(2)}-el6.dev.local" 行,这意味着已经设置了 VM 并且已经设置了主机名
    • 谢谢大家 - 我创建了一个包含各种输入的组合解决方案。最后,我在.vagrant 文件夹下创建了一个.vagrant_hostname 文件,并将主机名写入其中。依靠id 文件也可以,但我希望能够获取主机名用于其他目的。我无法弄清楚 Ruby 中的 if &lt;the command is "vagrant destroy"&gt; 行,但是检查文件是否存在的组合行为以及 .vagrant 文件夹在销毁时被删除的事实让我到达了我需要去的地方。因此我会接受这个答案。
    猜你喜欢
    • 2015-09-27
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多