def enable_vsan_vmknic(si, vmkernel_nic, cluster): tasks=[] # Update configuration spec for VMkernel networking configInfo = vim.vsan.host.ConfigInfo( networkInfo=vim.vsan.host.ConfigInfo.NetworkInfo(port=[ vim.vsan.host.ConfigInfo.NetworkInfo.PortConfig(device=vmkernel_nic) ])) # Enumerate the selected VMkernel adapter for each host and add it to the list of tasks hostProps = CollectMultiple(si.content, cluster.host, ['name', 'configManager.vsanSystem', 'configManager.storageSystem']) hosts = hostProps.keys() for host in hosts: print('Enable vSAN traffic on host {} with {}'.format(hostProps[host]['name'], vmkernel_nic)) task = hostProps[host]['configManager.vsanSystem'].UpdateVsan_Task(configInfo) wait_for_task(task) # Can make this faster by running tasks concurrently see below scratch code #tasks.append(task) # Execute the tasks #vsanapiutils.WaitForTasks(tasks, si) # Build vsanReconfigSpec step by step. It takes effect only after calling the VsanClusterReconfig method clusterConfig = vim.VsanClusterConfigInfo(enabled=True) vsanReconfigSpec = vim.VimVsanReconfigSpec( modify=True, vsanClusterConfig=clusterConfig)
def main(): args = GetArgs() if args.password: password = args.password else: password = getpass.getpass(prompt='Enter password for host %s and ' 'user %s: ' % (args.host, args.user)) #For python 2.7.9 and later, the defaul SSL conext has more strict #connection handshaking rule. We may need turn of the hostname checking #and client side cert verification context = None if sys.version_info[:3] > (2, 7, 8): context = ssl.create_default_context() context.check_hostname = False context.verify_mode = ssl.CERT_NONE # Disabling the annoying InsecureRequestWarning message requests.packages.urllib3.disable_warnings(InsecureRequestWarning) si = SmartConnect(host=args.host, user=args.user, pwd=password, port=int(args.port), sslContext=context) atexit.register(Disconnect, si) #for detecting whether the host is VC or ESXi aboutInfo = si.content.about if aboutInfo.apiType == 'VirtualCenter': majorApiVersion = aboutInfo.apiVersion.split('.')[0] if int(majorApiVersion) < 6: print( 'The Virtual Center with version %s (lower than 6.0) is not supported.' % aboutInfo.apiVersion) return -1 #Here is an example of how to access VC side VSAN Health Service API vcMos = vsanapiutils.GetVsanVcMos(si._stub, context=context) # Get VSAN Cluster Config System vccs = vcMos['vsan-cluster-config-system'] cluster = getClusterInstance(args.clusterName, si) if cluster is None: print("Cluster %s is not found for %s" % (args.clusterName, args.host)) return -1 # Check to see if Automatic Claiming is enabled, if so, we need to disable else we can continue vsanCluster = vccs.VsanClusterGetConfig(cluster=cluster) if (vsanCluster.defaultConfig.autoClaimStorage == True): print("Disabling Automatic Claiming on VSAN Cluster: %s" % args.clusterName) vsanSpec = vim.VimVsanReconfigSpec( vsanClusterConfig=vim.VsanClusterConfigInfo( defaultConfig=vim.VsanClusterConfigInfoHostDefaultInfo( autoClaimStorage=False)), modify=True) vsanTask = vccs.VsanClusterReconfig(cluster=cluster, vsanReconfigSpec=vsanSpec) vcTask = vsanapiutils.ConvertVsanTaskToVcTask(vsanTask, si._stub) vsanapiutils.WaitForTasks([vcTask], si) # Check to see if Dedupe & Compression is already enabled, if not, then we'll enable it if (vsanCluster.dataEfficiencyConfig.compressionEnabled == False or vsanCluster.dataEfficiencyConfig.dedupEnabled == False): print( "Enabling Compression/Dedupe capability on VSAN Cluster: %s" % args.clusterName) # Create new VSAN Reconfig Spec, both Compression/Dedupe must be enabled together vsanSpec = vim.VimVsanReconfigSpec( dataEfficiencyConfig=vim.VsanDataEfficiencyConfig( compressionEnabled=True, dedupEnabled=True), modify=True) vsanTask = vccs.VsanClusterReconfig(cluster=cluster, vsanReconfigSpec=vsanSpec) vcTask = vsanapiutils.ConvertVsanTaskToVcTask(vsanTask, si._stub) vsanapiutils.WaitForTasks([vcTask], si) else: print("Compression/Dedupe is already enabled on VSAN Cluster: %s" % args.clusterName)
def main(): # TEMP DEBUG print("Inputs for program are: ") for i in inputs: print(" ", i, inputs[i]) if inputs[i] == None: print("Missing a required value for ", i) try: si = None try: print("Trying to connect to VCENTER SERVER . . .") si = connect.SmartConnectNoSSL('https', inputs['vcenter_ip'], 443, inputs['vcenter_user'], inputs['vcenter_password']) except IOError as e: pass atexit.register(Disconnect, si) print("Connected to VCENTER SERVER !") content = si.RetrieveContent() cluster = get_obj(content, [vim.ClusterComputeResource], inputs['cluster']) print("Cluster Name is ",cluster.name) # Configure vmkernel adapter on all hosts for vSAN vmkernel_nic = "vmk0" enable_vsan_vmknic(si, vmkernel_nic, cluster) ## From https://github.com/storage-code/vsanDeploy/blob/master/vsanDeploy.py context = None context = ssl.create_default_context() context.check_hostname = False context.verify_mode = ssl.CERT_NONE vcMos = vsanapiutils.GetVsanVcMos(si._stub, context=context) vsanClusterSystem = vcMos['vsan-cluster-config-system'] vsanVcDiskManagementSystem = vcMos['vsan-disk-management-system'] # Build vsanReconfigSpec step by step, it only take effect after method VsanClusterReconfig is called vsanReconfigSpec = vim.VimVsanReconfigSpec( modify=True, vsanClusterConfig=vim.VsanClusterConfigInfo( enabled=True, defaultConfig=vim.VsanClusterConfigInfoHostDefaultInfo( autoClaimStorage=True ) ) ) print('Disable deduplication and compression for VSAN') vsanReconfigSpec.dataEfficiencyConfig = vim.VsanDataEfficiencyConfig( compressionEnabled=False, dedupEnabled=False) task = vsanClusterSystem.VsanClusterReconfig(cluster, vsanReconfigSpec) wait_for_task(task) ''' print("Configuring HCI for cluster %s ..." % cluster.name) hciCfgs = [] for mo in cluster.host: hciCfg = vim.ClusterComputeResource.HostConfigurationInput() hciCfg.host = mo hciCfgs.append(hciCfg) lockdownMode = vim.host.HostAccessManager.LockdownMode.lockdownDisabled NTP_SERVER = "time-c-b.nist.gov" hostConfigProfile = CreateHostConfigProfile(NTP_SERVER, lockdownMode) vSanCfgInfo = vim.vsan.cluster.ConfigInfo( enabled=True, defaultConfig=vim.vsan.cluster.ConfigInfo.HostDefaultInfo( autoClaimStorage=False)) print("vSanCfgInfo Set successfully ", vSanCfgInfo) vSanSpec = CreateDefaultVSanSpec(vSanCfgInfo) print("CreateDefaultVSanSpec successfully ", vSanSpec) #vcProf = GetVcProf() #dvsProfiles = GetDvsProfiles(cluster.host) clusterHciSpec = vim.ClusterComputeResource.HCIConfigSpec( hostConfigProfile=hostConfigProfile, vSanConfigSpec=vSanSpec) task = cluster.ConfigureHCI_Task(clusterSpec=clusterHciSpec, \ hostInputs=hciCfgs) wait_for_task(task) print("Successfully configured HCI cluster %s" % clusterName) ''' except vmodl.MethodFault as e: print("Caught vmodl fault: %s" % e.msg) return 1 except Exception as e: print("Caught exception: %s" % str(e)) return 1
def main(): args = GetArgs() if args.password: password = args.password else: password = getpass.getpass(prompt='Enter password for host %s and ' 'user %s: ' % (args.host, args.user)) # For python 2.7.9 and later, the defaul SSL conext has more strict # connection handshaking rule. We may need turn of the hostname checking # and client side cert verification context = None if sys.version_info[:3] > (2, 7, 8): context = ssl.create_default_context() context.check_hostname = False context.verify_mode = ssl.CERT_NONE si = SmartConnect(host=args.host, user=args.user, pwd=password, port=int(args.port), sslContext=context) atexit.register(Disconnect, si) cluster = getClusterInstance(args.clusterName, si) if args.vsanlicense: print 'Assign VSAN license' lm = si.content.licenseManager lam = lm.licenseAssignmentManager lam.UpdateAssignedLicense(entity=cluster._moId, licenseKey=args.vsanlicense) vcMos = vsanapiutils.GetVsanVcMos(si._stub, context=context) vsanClusterSystem = vcMos['vsan-cluster-config-system'] vsanVcDiskManagementSystem = vcMos['vsan-disk-management-system'] isallFlash = args.allflash print 'Enable VSAN with {} mode'.format( 'all flash ' if isallFlash else 'hybrid') hostProps = CollectMultiple( si.content, cluster.host, ['name', 'configManager.vsanSystem', 'configManager.storageSystem']) hosts = hostProps.keys() for host in hosts: disks = [ result.disk for result in hostProps[host] ['configManager.vsanSystem'].QueryDisksForVsan() if result.state == 'ineligible' ] print 'Find ineligible disks {} in host {}'.format( [disk.displayName for disk in disks], hostProps[host]['name']) for disk in disks: if yes('Do you want to wipe disk {}?\nPlease Always check the partition table and the data stored' ' on those disks before doing any wipe! (yes/no)?'.format( disk.displayName)): hostProps[host][ 'configManager.storageSystem'].UpdateDiskPartitions( disk.deviceName, vim.HostDiskPartitionSpec()) tasks = [] configInfo = vim.VsanHostConfigInfo( networkInfo=vim.VsanHostConfigInfoNetworkInfo(port=[ vim.VsanHostConfigInfoNetworkInfoPortConfig( device=args.vmknic, ipConfig=vim.VsanHostIpConfig(upstreamIpAddress='224.1.2.3', downstreamIpAddress='224.2.3.4')) ])) for host in hosts: print 'Enable VSAN trafic in host {} with {}'.format( hostProps[host]['name'], args.vmknic) task = hostProps[host]['configManager.vsanSystem'].UpdateVsan_Task( configInfo) tasks.append(task) vsanapiutils.WaitForTasks(tasks, si) del tasks[:] print 'Enable VSAN by claiming disks manually' #Build vsanReconfigSpec step by step, it only take effect after method VsanClusterReconfig is called vsanReconfigSpec = vim.VimVsanReconfigSpec( modify=True, vsanClusterConfig=vim.VsanClusterConfigInfo( enabled=True, defaultConfig=vim.VsanClusterConfigInfoHostDefaultInfo( autoClaimStorage=False))) if isallFlash: print 'Enable deduplication and compression for VSAN' vsanReconfigSpec.dataEfficiencyConfig = vim.VsanDataEfficiencyConfig( compressionEnabled=True, dedupEnabled=True) if args.faultdomains: print 'Add fault domains in vsan' faultDomains = [] #args.faultdomains is a string like f1:host1,host2 f2:host3,host4 for faultdomain in args.faultdomains.split(): fname, hostnames = faultdomain.split(':') domainSpec = vim.cluster.VsanFaultDomainSpec( name=fname, hosts=[ host for host in hosts if hostProps[host]['name'] in hostnames.split(',') ]) faultDomains.append(domainSpec) vsanReconfigSpec.faultDomainsSpec = vim.VimClusterVsanFaultDomainsConfigSpec( faultDomains=faultDomains) task = vsanClusterSystem.VsanClusterReconfig(cluster, vsanReconfigSpec) vsanapiutils.WaitForTasks([task], si) diskmap = {host: {'cache': [], 'capacity': []} for host in hosts} cacheDisks = [] capacityDisks = [] if isallFlash: #Get eligible ssd from host for host in hosts: ssds = [ result.disk for result in hostProps[host] ['configManager.vsanSystem'].QueryDisksForVsan() if result.state == 'eligible' and result.disk.ssd ] smallerSize = min([ disk.capacity.block * disk.capacity.blockSize for disk in ssds ]) for ssd in ssds: size = ssd.capacity.block * ssd.capacity.blockSize if size == smallerSize: diskmap[host]['cache'].append(ssd) cacheDisks.append((ssd.displayName, sizeof_fmt(size), hostProps[host]['name'])) else: diskmap[host]['capacity'].append(ssd) capacityDisks.append((ssd.displayName, sizeof_fmt(size), hostProps[host]['name'])) else: for host in hosts: disks = [ result.disk for result in hostProps[host] ['configManager.vsanSystem'].QueryDisksForVsan() if result.state == 'eligible' ] ssds = [disk for disk in disks if disk.ssd] hdds = [disk for disk in disks if not disk.ssd] for disk in ssds: diskmap[host]['cache'].append(disk) size = disk.capacity.block * disk.capacity.blockSize cacheDisks.append((disk.displayName, sizeof_fmt(size), hostProps[host]['name'])) for disk in hdds: diskmap[host]['capacity'].append(disk) size = disk.capacity.block * disk.capacity.blockSize capacityDisks.append((disk.displayName, sizeof_fmt(size), hostProps[host]['name'])) print 'Claim these disks to cache disks' for disk in cacheDisks: print 'Name:{}, Size:{}, Host:{}'.format(disk[0], disk[1], disk[2]) print 'Claim these disks to capacity disks' for disk in capacityDisks: print 'Name:{}, Size:{}, Host:{}'.format(disk[0], disk[1], disk[2]) for host, disks in diskmap.iteritems(): if disks['cache'] and disks['capacity']: dm = vim.VimVsanHostDiskMappingCreationSpec( cacheDisks=disks['cache'], capacityDisks=disks['capacity'], creationType='allFlash' if isallFlash else 'hybrid', host=host) task = vsanVcDiskManagementSystem.InitializeDiskMappings(dm) tasks.append(task) print 'Wait for create disk group tasks finish' vsanapiutils.WaitForTasks(tasks, si) del tasks[:] print 'Display disk groups in each host' for host in hosts: diskMaps = vsanVcDiskManagementSystem.QueryDiskMappings(host) for index, diskMap in enumerate(diskMaps, 1): print 'Host:{}, DiskGroup:{}, Cache Disks:{}, Capacity Disks:{}'.format( hostProps[host]['name'], index, diskMap.mapping.ssd.displayName, [disk.displayName for disk in diskMap.mapping.nonSsd]) print 'Enable perf service on this cluster' vsanPerfSystem = vcMos['vsan-performance-manager'] task = vsanPerfSystem.CreateStatsObjectTask(cluster) vsanapiutils.WaitForTasks([task], si)