Remover nodos vagantes do servidor chef ao destruir

Ao trabalhar com o Vagrant e o Chef Server , uma coisa que mais me incomodou foi remover manualmente os registros do nó e do cliente. O bom: é possível. O ruim: você tem que adicionar o código em todos os Vagrantfilelugares onde deseja usá-lo (tentarei criar um plugin em breve). Tudo que você precisa fazer é adicionar as seguintes linhas de código ao seu Vagrantfile:

module Vagrant
module Provisioners
class Base
require 'chef'
require 'chef/config'
require 'chef/knife'
end

class ChefClient
::Chef::Config.from_file(File.join(File.dirname(__FILE__), '.chef', 'knife.rb'))

def cleanup
node
= env[:vm].config.vm.host_name

env
[:ui].info "Attempting to clean up client '#{node}' on chef server."
begin
::Chef::REST.new(::Chef::Config[:chef_server_url]).delete_rest("clients/#{node}")
rescue Net::HTTPServerException => e
if e.message == '404 "Not Found"'
env
[:ui].info "Client '#{node}' not found."
else
env
[:ui].error "An error occured. You will have to remove the client manually."
end
rescue Exception => e
env
[:ui].error "An error occured. You will have to remove the client manually."
else
env
[:ui].info "Client '#{node}' successfully removed from chef server."
end

env
[:ui].info "Attempting to clean up node '#{node}' on chef server."
begin
::Chef::REST.new(::Chef::Config[:chef_server_url]).delete_rest("nodes/#{node}")
rescue Net::HTTPServerException => e
if e.message == '404 "Not Found"'
env
[:ui].info "Node '#{node}' not found."
else
env
[:ui].error "An error occured. You will have to remove the node manually."
end
rescue Exception => e
env
[:ui].error "An error occured. You will have to remove the node manually."
else
env
[:ui].info "Node '#{node}' successfully removed from chef server."
end
end
end
end
end

A configuração do chef é lida a partir de um (consulte Compartilhar a configuração da faca do chef.rb com o vagrant para obter detalhes). Tudo o que ele faz é pedir ao servidor do chef para remover o registro do nó e do cliente usando a API REST. Basta digitar:knife.rb

$ vagrant destroy

Se você não quiser excluir os clientes de produção por acidente, sugiro dar nomes exclusivos às suas caixas vagrant. Eu normalmente faço assim:

vm_name = "vagrant-#{name}-#{ENV['USER']}"
config
.vm.host_name = vm_name

Dessa forma, obtenho algo como , supondo que esteja definido como . Isso também tem a vantagem de que, ao trabalhar em uma equipe no mesmo projeto, você não tem conflitos (supondo que os nomes de usuário sejam únicos).vagrant-myproject-box1-thomasnamemyproject-box1