Skip to content

Instantly share code, notes, and snippets.

@cunnie
Last active August 29, 2015 14:07
Show Gist options
  • Save cunnie/e0c50f4721827c0c304f to your computer and use it in GitHub Desktop.
Save cunnie/e0c50f4721827c0c304f to your computer and use it in GitHub Desktop.
Cleans up old directories left over from Cloud Foundry / BOSH deployments
#!/usr/bin/env ruby
require 'rbvmomi/vim'
require 'slop'
require 'byebug'
opts = Slop.parse(strict: true, help: true) do
banner 'bosh_cleaner.rb --vcenter vcenter.cf.nono.com --ds_name freenas --dc_name "My DC" --password blahblah'
on('vcenter=', 'vCenter host (e.g. "vcenter.cf.nono.com")')
on('user=', 'vCenter username (defaults to "root")')
on('password=', 'vCenter password (e.g. "vmware")')
on('dc_name=', 'datacenter name (e.g. "My Datacenter")')
on('ds_name=', 'datastore name (e.g. "freenas")')
end
connection = RbVmomi::VIM.connect(
host: opts[:vcenter],
user: opts[:user],
password: opts[:password],
insecure: true
)
dc_name = opts[:dc_name]
ds_name = opts[:ds_name]
datacenter = connection.serviceInstance.find_datacenter(dc_name)
def bosh_vm_names(datacenter)
clusters = datacenter.hostFolder.children.select { |possible_cluster| possible_cluster.is_a?(RbVmomi::VIM::ClusterComputeResource) }
esxi_hosts = []
clusters.each do |cluster|
esxi_hosts.concat(cluster.host.select { |possible_esxi_host| possible_esxi_host.is_a?(RbVmomi::VIM::HostSystem) })
end
bosh_vms = []
esxi_hosts.each do |esxi_host|
vms = esxi_host.vm.select do |possible_vm|
possible_vm.is_a?(RbVmomi::VIM::VirtualMachine) && possible_vm.name.match(/^vm-/)
end
bosh_vms.concat(vms)
end
bosh_vms.map(&:name)
end
def directory_names(datacenter, ds_name)
private_datastore = datacenter.datastore.find { |datastore| datastore.name == ds_name }
search_result = private_datastore.browser.SearchDatastore_Task(datastorePath: "[#{ds_name}] /").wait_for_completion
search_result.file.map(&:path).select { |path| path.match(/^vm-/) }
end
directories_to_delete = directory_names(datacenter, ds_name) - bosh_vm_names(datacenter)
puts directories_to_delete.sort
source 'https://rubygems.org'
gem 'rvc'
gem 'rbvmomi'
gem 'slop'
group :development do
gem 'byebug'
end
GEM
remote: https://rubygems.org/
specs:
backports (3.6.1)
builder (3.2.2)
byebug (3.4.1)
columnize (~> 0.8)
debugger-linecache (~> 1.2)
slop (~> 3.6)
columnize (0.8.9)
debugger-linecache (1.2.0)
highline (1.6.21)
mini_portile (0.6.0)
nokogiri (1.6.3.1)
mini_portile (= 0.6.0)
rbvmomi (1.8.2)
builder
nokogiri (>= 1.4.1)
trollop
rvc (1.8.0)
backports (>= 1.18.2)
highline (>= 1.6.1)
rbvmomi (>= 1.6.0)
terminal-table (>= 1.4.2)
trollop (>= 1.16.2)
zip (>= 2.0.2)
slop (3.6.0)
terminal-table (1.4.5)
trollop (2.0)
zip (2.0.2)
PLATFORMS
ruby
DEPENDENCIES
byebug
rbvmomi
rvc
slop
@cunnie
Copy link
Author

cunnie commented Dec 19, 2014

git clone blah-blah
cd blah-blah
bundle
chmod +x Bosh_cleaner.rb
bundle exec ./Bosh_cleaner.rb  --vcenter vcenter.cf.nono.com --password vmware --dc_name Datacenter --ds_name synology > /tmp/vms_to_delete.txt
scp /tmp/vms_to_delete.txt root@some_esxi_host:/tmp/
ssh root@some_esxi_host
cd /vmfs/volumes/synology
for EMPTY_DIR in $(cat /tmp/vms_to_delete.txt); do 
  echo "deleting $EMPTY_DIR"
  rm -rf  $EMPTY_DIR
  sleep 1
done

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment