2017-05-04 212 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''行 –