2017-05-04 166 views
1

我正在尝试使用流浪汉和厨师客户端配置为我正在处理的任务。我希望能够使用vagrant up生成的唯一名称,将实例加入Chef Server,然后在完成时删除该节点。我有这个主要工作;当我运行Chef Destroy时,我被困在厨师服务器的自动删除节点上。我需要找到一种缓存名称并稍后检索的方法,只需运行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知道稍后将其删除?

回答

2

你不能只使用Vagrantfile。我认为,每一次流浪汉都会读到流浪汉文件,所以每次都会生成另一个随机名称。您可以执行的操作是将生成的主机名保存到第一次运行时的环境变量或文件中,然后在下次运行时从中读取,然后删除文件或取消设置vagrant destroy上的env变量。

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

# 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 
+2

我想你可以只依赖于流浪者产生的'id'文件时,它会创建虚拟机,这是VirtualBox的/ vmware VM Id,所以你不需要维护另一个文件。 –

+0

我很久没有和流浪者一起工作过。如果vagrant将主机名本身保存到某个文件中,那么使用该文件肯定会是更清晰的解决方案。 –

+2

好吧,需要详细说明 - 不,它不会保存主机名本身,但vagrant维护一个文件与它创建的虚拟机的ID(在.vagrant文​​件夹下的部分文件),所以我会看到OP是如果这个文件存在,这意味着虚拟机已经设置并且主机名已被设置,则不运行'config.vm.hostname ='vagrant - #{SecureRandom.hex(2)} - el6.dev.local''行 –