Buenas, en este post vamos a ver cómo automatizar el proceso para crear un vDC en nuestro entorno de vCloud para un nuevo Tenant.
Lo primero es cerciorarnos que tenemos el módulo de cloud de VMware. Para ello mostramos los módulos que tenemos cargados, de la siguiente manera:

También, ya que estamos os dejo un par de módulos muy útiles para trabajar con vCloud Director. Para instalarlos simplemente debéis ejecutar lo siguiente:

Cuando veamos que los módulos han sido localizados, los instalaremos con el siguiente comando:


Bien, ahora que ya tenemos el módulo de Cloud instalado, vamos a pasar a analizar el script.
El script tiene varios bloques definidos y con un fin cada uno de ellos:
- Creación de Menú Interactivo para introducir los parámetros que tendrá nuestro Virtual Datacenter.
- Adecuación de las variables a lo que espera vCloud Director.
- Creación de la Organizacion si no existiera.
- Configuración de la Organización si se ha creado.
- Creación del Virtual Datacenter
- Configuración del Virtual Datacenter, entre las configuraciones tenemos la asignación de cuotas, garantía de recursos, aplicación de la Storage Policy por defecto y asignación de cuota de almacenamiento.
- Al final, imprimimos en pantalla las configuraciones que hemos realizado sobre el Virtual Datacenter creado.
Debemos tener en cuenta que en mi caso, he dado por hecho que el «Allocation Model» es «PayAsYouGo«. Podéis modificarlo a vuestro interés.
####################################################################### Creación de Organization Virtual Datacenter en vCloud Director mediante PowerCLI ## ## V. 1.0 Mario Gómez - Just2Kloud ## ## Sintaxis: create_orgvdc.ps1 ## ##################################################################### # Credenciales $user_vcloud = "just2kloud" $pass_vcloud = "Just2Kloud.2020" # Recogemos los parámetros para la creación del OrgvDC $vcloud_server = Read-Host -Prompt "Introduce FQDN/IP vCloud Director" $org_Name = Read-Host -Prompt "Introduce el Nombre de la Organización" $vdc_Name = Read-Host -Prompt "Introduce el Nombre para el nuevo OrgvDC" $vdc_Description = Read-Host -Prompt "Introduce una descripción para el OrgvDC $vdc_Name " $vdc_Memory = Read-Host -Prompt "Introduce la capacidad de memoria para el OrgvDC $vdc_Name (GB) " $vdc_vCPU = Read-Host -Prompt "Introduce el Nº vCPU para el OrgvDC $vdc_Name " $vdc_Storage_Allocation = Read-Host -Prompt "Introduce la capacidad de Almacenamiento para el OrgvDC $vdc_Name (GB) " $cpu_percent = Read-Host -Prompt "Introduce el Porcentaje de Garantía de CPU para el OrgvDC $vdc_Name" $mem_percent = Read-Host -Prompt "Introduce el Porcentaje de Garantía de Memoria para el OrgvDC $vdc_Name" $network_max_count = Read-Host -Prompt "Introduce Maximum Provisioned Networks" # Declaración de Variables/contadores fij@s y Inicialización de Arrays $lista = @() $lista_sp = @() $lista_pvdc = @() $count = 0 $count_spbm = 0 $pvdc_count = 0 # NOTA: Valor en Mhz de 1 CPU en nuestro entorno. En este caso hemos puesto 2,4 Ghz = 2400 Mhz $cpu_speed = 2400 #### REALIZAMOS LAS CONVERSIONES NECESARIAS #### # Convertimos el valor para CPU Quota a MHz. Pasamos de Nº de vCPU a Total de Mhz en nuestro VDC $vcpu_quota_mhz = [int]$vdc_vCPU $vcpu_quota_mhz = $vcpu_quota_mhz * $cpu_speed # Convertimos el valor para Memory Quota a MB $vmemory_quota_mb = [int]$vdc_Memory $vmemory_quota_mb = $vmemory_quota_mb * 1024 # Convertimos el valor para Storage Allocation a MB $storage_limit_mb = [int]$vdc_Storage_Allocation $storage_limit_mb = $storage_limit_mb * 1024 # Conectamos a la instancia de vCloud Director Write-Host "Conectando a Instancia vCloud Director [ $vcloud_server ]" Connect-CIServer -Server $vcloud_server -User $user_vcloud -Password $pass_vcloud #### GENERAMOS EL MENU INTERACTIVO PARA PODER SELECCIONAR EL PROVIDER VDC #### # Obtenemos un listado de los Providers vDC y los mostraremos para seleccionar el Provder sobre el cuál queremos desplegar el OrgvDC $provider_vdc_list = Get-ProviderVdc -WarningAction Ignore -InformationAction Ignore $provider_vdc_list | ForEach-Object {$hash_pvdc = @{ Provider = $_.Name ; Option = $pvdc_count};$obj_pvdc = New-Object PSObject -Property $hash_pvdc; $lista_pvdc += $obj_pvdc ; $pvdc_count++} # Imprimimos la lista de Network Pool y que se elija el Network Pool Write-Host "*** Lista Provider vDC ***" $lista_pvdc | Out-Host $option_pvdc = Read-Host -Prompt "Elige el ProviderVDC para el OrgvDC en la Lista $lista_pvdc" #### GENERAMOS EL MENU INTERACTIVO PARA PODER SELECCIONAR EL NETWORK POOL QUE QUEREMOS PARA NUESTRO VDC #### # Obtenemos el listado de NetworkPool $networkpool = Get-NetworkPool -WarningAction Ignore -InformationAction Ignore $networkpool | ForEach-Object {$hash = @{ Capacity = $_.Capacity ; Name = $_.Name; Option = $count};$obj = New-Object PSObject -Property $hash; $lista += $obj ; $count++} # Imprimimos la lista de Network Pool y que se elija el Network Pool Write-Host "*** Lista Network Pool para Provider vDC ***" $lista | Out-Host $option = Read-Host -Prompt "Elige el Network Pool para el OrgvDC en la Lista $lista" #### GENERAMOS EL MENU INTERACTIVO PARA PODER SELECCIONAR LA STORAGE POLICY QUE QUEREMOS PARA NUESTRO VDC #### # Recogemos la Default Storage Policy que queremos aplicar para el OrgvDC a crear Write-Host "*** Lista Storage Profile del Provider Datacenter ***" $pvdc_extension = Get-ProviderVdc -WarningAction Ignore -InformationAction Ignore $list_spbm = $pvdc_extension.ExtensionData.StorageProfiles.ProviderVdcStorageProfile $list_spbm | ForEach-Object {$hash_spbm = @{ Name = $_.Name; Option = $count_spbm};$obj_spbm = New-Object PSObject -Property $hash_spbm; $lista_sp += $obj_spbm ; $count_spbm++} $lista_sp | Out-Host $option_spbm = Read-Host -Prompt "Elige la Default Storage Policy para el OrgvDC $vdc_Name" ############################################################################# COMIENZA LA CRECIÓN DEL VIRTUAL DATACENTER ################ ##################################################################### # CREACIÓN Y CONFIGURACIÓN DE LA ORGANIZACIÓN SI PROCEDE # Comprobamos si existe la organización, sino existe la creamos. if (Get-org -Name $org_Name -ErrorAction Ignore) { Write-Host "Se creará el vDC sobre la Organización [$org_Name]" -ForegroundColor Yellow } else { Write-Host "Creando la Organizacion [$org_Name] para crear el vDC" -ForegroundColor Yellow -NoNewline New-Org -Name $org_Name -FullName $org_Name -Description $org_Name | Out-Null if (!$?) { Write-Host "[ERROR] Fallo al crear la Organización" -ForegroundColor Red Disconnect -SERVER $vcloud_server -TIPO VCLOUD exit 1 } else { Write-Host "[ OK ] Organización [$org_Name] creada correctamente" -ForegroundColor Green # Configuramos los valores de vAppLease y vAppTemplateLease Write-Host "Configurando a Not Expired los valores de Lease para vApp/vAppTemplates y modificamos valores para Operation Limits" -ForegroundColor Yellow -NoNewline $organization = Get-Org -Name $org_Name $organization.ExtensionData.Settings.VAppLeaseSettings.StorageLeaseSeconds = 0 $organization.ExtensionData.Settings.VAppLeaseSettings.DeploymentLeaseSeconds = 0 $organization.ExtensionData.Settings.VAppTemplateLeaseSettings.StorageLeaseSeconds = 0 $organization.ExtensionData.Settings.OrgOperationLimitsSettings.OperationsPerUser = 10 $organization.ExtensionData.Settings.OrgOperationLimitsSettings.OperationsPerOrg = 10 $organization.ExtensionData.Settings.OrgOperationLimitsSettings.ConsolesPerVmLimit = 10 $organization.ExtensionData.Settings.UpdateServerData() Write-Host "[ OK ] Organización [$org_Name] configurada correctamente" -ForegroundColor Green } } ### CREACIÓN Y CONFIGURACIÓN DEL VIRTUAL DATACENTER # Creamos el OrgvDC según los parámetros pasados. # Nota : He dado por hecho que el Allocation Model es de pago por uso. Podéis modificarlo Write-Host "[INFO] Creando OrgvDC [$vdc_Name] ..." -NoNewline $vdc = New-OrgVdc -Name $vdc_Name -AllocationModelPayAsYouGo -Description $vdc_Description -ProviderVdc (($provider_vdc_list[$option_pvdc]).Name) -NetworkPool $networkpool[$option] -VMCpuCoreMHz $cpu_speed -Org (Get-Org -Name $org_Name) -Confirm:$false -WarningAction Ignore -InformationAction Ignore if (!$?) { Write-Host " [**ERROR**] Ha fallado la creación de OrgvDC [$vdc_Name]" -ForegroundColor Red exit 1 } else { Write-Host " [**OK**] Creación de OrgvDC [$vdc_Name] correcta" -ForegroundColor Green } ### CONFIGURACIÓN DEL VIRTUAL DATACENTER # Una vez Creado configuramos el OrgvDC completamente. Write-Host "Configurando OrgvDC [$vdc_Name] con los parámetros indicados ..." -NoNewline -ForegroundColor Yellow Set-OrgVdc -CpuGuaranteedPercent $cpu_percent -MemoryGuaranteedPercent $mem_percent -NetworkMaxCount $network_max_count -OrgVdc $vdc -ThinProvisioned $true -Confirm:$false -WarningAction Ignore -InformationAction Ignore | Out-Null if (!$?) { Write-Host " [**ERROR**] Ha fallado la configuración de OrgvDC [$vdc_Name]" -ForegroundColor Red exit 1 } else { Write-Host " [**OK**] Configuración de OrgvDC [$vdc_Name] correcta" -ForegroundColor Green } # Configuramos los valores de CPU Quota y Memory Quota Write-Host "[INFO] Continuamos configurando CPU Quota, MEM Quota, Default SPBM" -ForegroundColor Magenta $vdc_extension = Get-OrgVdc -Name $vdc_Name -WarningAction Ignore $vdc_extension.ExtensionData.ComputeCapacity.cpu.Limit = $vcpu_quota_mhz $vdc_extension.ExtensionData.ComputeCapacity.Memory.Limit = $vmemory_quota_mb # Configuramos el VM Quota a Unlimited $vdc_extension.ExtensionData.VmQuota = 0 # Actualizamos la configuración $vdc_extension.ExtensionData.UpdateServerData() # Volvemos a recoger el OrgvDC $vdc_extension = Get-OrgVdc -Name $vdc_Name -WarningAction Ignore # Configuramos el Default Storage Policy # Asignamos a variable la default spbm $vdc_default_spbm = $list_spbm[$option_spbm] $pvdc_extension = Get-ProviderVdc -WarningAction Ignore # Inicializamos el objeto Reference $ref_spbm = New-Object VMware.VimAutomation.Cloud.Views.Reference # Obtenemos la información de la Storage Policy a aplicar como Default $ref = $pvdc_extension.ExtensionData.StorageProfiles.ProviderVdcStorageProfile | where {$_.Name -eq $vdc_default_spbm.Name} # Aplicamos la nueva Default Policy si no está aplicada ya $spbm_name = $ref.Name if (($vdc_extension.ExtensionData.VdcStorageProfiles.VdcStorageProfile.Name) -eq $spbm_name) { Write-Host "[INFO] Default Storage Policy [$spbm_name] aplicada ya" -ForegroundColor Yellow Write-Host "[INFO] Configurando Storage Policy [$spbm_name] para aplicar el Limit MB" -ForegroundColor Yellow # Configurando el Storage Limit para el Storage Profile ya que probablemente o es la SPBM por defecto, o solo existe un SPBM para el Provider vDC $orgvDCStorageProfile = search-cloud -querytype AdminOrgVdcStorageProfile | where {($_.Name -match $ref.Name) -and ($_.VdcName -eq $vdc_Name)} | Get-CIView $orgvDCStorageProfile.Limit = $storage_limit_mb $orgvDCStorageProfile.UpdateServerData() | Out-Null } else { Write-Host "[INFO] Vamos a aplicar la Default Policy [$spbm_name] a OrgvDC [$vdc_Name]..." -NoNewline # Creamos los Parámetros para Storage Allocation + SPBM $spParams = new-object VMware.VimAutomation.Cloud.Views.VdcStorageProfileParams $spParams.Enabled = $true $spParams.Default = $true $spParams.Limit = $storage_limit_mb $spParams.Units = "MB" $spParams.ProviderVdcStorageProfile = $ref.Href # Creamos el Objeto para añadir la SPBM al OrgvDC y le aplicamos los parámetros $UpdateParams = new-object VMware.VimAutomation.Cloud.Views.UpdateVdcStorageProfiles $UpdateParams.AddStorageProfile = $spParams # Añadimos la SPBM al OrgvDC $vdc_extension.ExtensionData.CreateVdcStorageProfile($UpdateParams) | Out-Null # Añadimos la SPBM Creada como Default $orgvDCStorageProfile = search-cloud -querytype AdminOrgVdcStorageProfile | where {($_.Name -match $ref.Name) -and ($_.VdcName -eq $vdc_Name)} | Get-CIView $orgvDCStorageProfile.Default = $true $orgvDCStorageProfile.UpdateServerData() | Out-Null # Eliminamos otras SPBM que se hayan añadido en la creación $orgvDCAnyProfile = search-cloud -querytype AdminOrgVdcStorageProfile | where {($_.VdcName -eq $vdc_Name) -and ($_.Name -ne $ref.Name)} | Get-CIView $orgvDCAnyProfile | ForEach-Object { # Deshabilitamos la SPBM primero $_.Enabled = $false $orgvDCAnyProfile.UpdateServerData() | Out-Null # Realizamos el borrado de cada SPBM que no aporta $ProfileUpdateParams = new-object VMware.VimAutomation.Cloud.Views.UpdateVdcStorageProfiles $ProfileUpdateParams.RemoveStorageProfile = $org $ProfileUpdateParams.RemoveStorageProfile = $_.href $vdc_extension.ExtensionData.CreateVdcStorageProfile($ProfileUpdateParams) | out-null } Write-Host " [OK] Default Storage Policy aplicada" -ForegroundColor Green } # Aplicamos los cambios realizados $vdc_extension.ExtensionData.UpdateServerData() ### FIN DE CREACIÓN Y CONFIGURACIÓN VDC Write-Host " [FIN] OrgvDC [$vdc_Name] creado correctamente" -ForegroundColor Green Write-host "*** N U E V O O r g v D C ***" Get-OrgVdc -Name $vdc_Name | Select Id,Name,AllocationModel,CpuLimitGhz,MemoryLimitGB,NetworkPool,Org,ProviderVdc,StorageLimitGB | Format-Table -AutoSize Write-Host "Desconectando Instancia vCloud Director [$vcloud_server]" -ForegroundColor Green Disconnect-CIServer -Server $vcloud_server -Confirm:$false
Si te ha parecido interesantes y útil, gracias por compartir 😉