45 lines
1.5 KiB
Ruby
45 lines
1.5 KiB
Ruby
require 'rbvmomi'
|
|
|
|
module Puppet::Parser::Functions
|
|
newfunction(:get_vcenter_cluster_id, :type => :rvalue, :doc => <<-EOS
|
|
Return a string of vcenter cluster moref id, clusters names get from hiera
|
|
vcenter hash. The first argument - vcenter datacenter moref id, where
|
|
search clusters, ex:
|
|
get_vcenter_cluster_id('datacenter-126')
|
|
EOS
|
|
) do |args|
|
|
|
|
datacenter_id=args[0]
|
|
vcenter_hash = function_hiera_hash(['vcenter'])
|
|
clusters_id=[]
|
|
retry_count = 4
|
|
|
|
vcenter_hash['computes'].each do |cluster_settings|
|
|
vc_cluster = cluster_settings['vc_cluster']
|
|
vc_host = cluster_settings['vc_host']
|
|
vc_password = cluster_settings['vc_password']
|
|
vc_user = cluster_settings['vc_user']
|
|
|
|
begin
|
|
vim = RbVmomi::VIM.connect(host: vc_host, ssl: true, insecure: true, user: vc_user, password: vc_password)
|
|
rootFolder = vim.serviceInstance.content.rootFolder
|
|
dc = rootFolder.childEntity.grep(RbVmomi::VIM::Datacenter).find { |x| x.to_s == 'Datacenter("'+datacenter_id+'")' } or fail 'Can not search datacenter with id: ' + datacenter_id
|
|
cluster = dc.find_compute_resource(vc_cluster) or fail 'Can not search cluster: ' + vc_cluster
|
|
cluster_id = cluster.to_s.gsub!(/^[^"]+"([^"]+)"[^"]*/, '\1')
|
|
clusters_id.push(cluster_id)
|
|
rescue
|
|
retry_count -= 1
|
|
if retry_count > 0
|
|
sleep 5
|
|
retry
|
|
else
|
|
warning('Can not get moRefId for ' + vc_cluster + ' cluster')
|
|
raise
|
|
end
|
|
end
|
|
end
|
|
|
|
return clusters_id.sort.join(',')
|
|
end
|
|
end
|