Durch einen VMware Community Thread war ich endlich motiviert mal wieder an meinem vCloud Director PowerShell Modul etwas weiter zu arbeiten. Die neue Funktion sollte in einem Schritt ein geroutetes vCloud Director Org Netzwerk erstellen können. Die eigentliche Anforderung aus dem Community Thread war zwar ein zusätzliches Netz an ein bestehendes Edge Gateway zu hängen, der Weg über das neue Netz erschien mir jedoch sinnvoller.
Das Ergebnis ist ein neues Org Netzwerk, welches mit einem bestehenden Edge Gateway verbunden ist. Das Org Netzwerk wird per Default als „Shared“ erzeugt, das beideutet alle VDC`s der Organisation haben Zugriff auf das neue Netzwerk. Diese Einstellung ist aber als Parameter der Funktion verfügbar, soll das Netz nicht in allen OrgVDC`s verfügbar sein muss der Parameter -Shared:$False genutzt werden
Getestete Versionen:
- VMware vCloud Director 8.20 / 9.1
- VMware PowerCLI 6.5.1 / 6.5.4
- PowerShell 5.0 / 5.1
Warum eine eigene Funktion?
Leider hat das eigentlich auf den ersten Blick passende Cmdlet New-OrgNetwork zwei Probleme:
- Es kann nicht mit einem Edge Gatway verbunden werden
- Es funktioniert nur für ältere vCloud Director Versionen:
You can run this cmdlet only against vCloud Director 1.5.x environments.
Somit musste ähnlich wie vorher auch schon bei der Erstellung des Edge Gateway eine eigene Funktion erstellt werden um die Anforderungen zu erfüllen.
vCloud Director Org Netzwerk erstellen per Skript
Hier ist der Auszug der neuen Funktion aus meinem vCloud Director PowerShell Modul.
Function New-MyOrgNetwork { <# .SYNOPSIS Creates a new Org Network with Default Parameters .DESCRIPTION .NOTES File Name : New-MyOrgNetwork.ps1 Author : Markus Kraus Version : 1.1 State : Ready .LINK https://mycloudrevolution.com .EXAMPLE New-MyOrgNetwork -Name Test -OrgVdcName "Test-OrgVDC" -OrgName "Test-Org" -EdgeName "Test-OrgEdge" -SubnetMask 255.255.255.0 -Gateway 192.168.66.1 -IPRangeStart 192.168.66.100 -IPRangeEnd 192.168.66.200 .EXAMPLE New-MyOrgNetwork -Name Test -OrgVdcName "Test-OrgVDC" -OrgName "Test-Org" -EdgeName "Test-OrgEdge" -SubnetMask 255.255.255.0 -Gateway 192.168.66.1 -IPRangeStart 192.168.66.100 -IPRangeEnd 192.168.66.200 -Shared:$False .EXAMPLE $params = @{ 'Name' = 'Test'; 'OrgVdcName'= 'Test-OrgVDC'; 'OrgName'='Test-Org'; 'EdgeName'='Test-OrgEdge'; 'SubnetMask' = '255.255.255.0'; 'Gateway' = '192.168.66.1'; 'IPRangeStart' = '192.168.66.100'; 'IPRangeEnd' = '192.168.66.200' } New-MyOrgNetwork @params -Verbose .PARAMETER Name Name of the New Org Network as String .PARAMETER OrgVDCName OrgVDC where the new Org Network should be created as string .PARAMETER OrgName Org where the newOrg Networkshould be created as string .PARAMETER EdgeName Edge Gateway Name for the new Org Network as String .PARAMETER SubnetMask Subnet Mask of the New Org Network as IP Address .PARAMETER Gateway Gateway of the New Org Network as IP Address .PARAMETER IPRangeStart IP Range Start of the New Org Network as IP Address .PARAMETER IPRangeEnd IP Range End of the New Org Network as IP Address .PARAMETER Shared Switch for Shared OrgVDC Network Default: $True .PARAMETER Timeout Timeout for the Org Network to become Ready Default: 120s #> Param ( [Parameter(Mandatory=$True, ValueFromPipeline=$False, HelpMessage="Name of the New Org Network as String")] [ValidateNotNullorEmpty()] [String] $Name, [Parameter(Mandatory=$True, ValueFromPipeline=$False, HelpMessage="OrgVDC where the new Org Network should be created as string")] [ValidateNotNullorEmpty()] [String] $OrgVdcName, [Parameter(Mandatory=$True, ValueFromPipeline=$False, HelpMessage="Org where the new Org Network should be created as string")] [ValidateNotNullorEmpty()] [String] $OrgName, [Parameter(Mandatory=$True, ValueFromPipeline=$False, HelpMessage="Edge Gateway Name for the new Org Network as String")] [ValidateNotNullorEmpty()] [String] $EdgeName, [Parameter(Mandatory=$True, ValueFromPipeline=$False, HelpMessage="Subnet Mask of the New Org Network as IP Address")] [ValidateNotNullorEmpty()] [IPAddress] $SubnetMask, [Parameter(Mandatory=$True, ValueFromPipeline=$False, HelpMessage="Gateway of the New Org Network as IP Address")] [ValidateNotNullorEmpty()] [IPAddress] $Gateway, [Parameter(Mandatory=$True, ValueFromPipeline=$False, HelpMessage="IP Range Start the New Org Network as IP Address")] [ValidateNotNullorEmpty()] [IPAddress] $IPRangeStart, [Parameter(Mandatory=$True, ValueFromPipeline=$False, HelpMessage="IP Range End the New Org Network as IP Address")] [ValidateNotNullorEmpty()] [IPAddress] $IPRangeEnd, [Parameter(Mandatory=$False, ValueFromPipeline=$False, HelpMessage="Switch for Shared OrgVDC Network")] [ValidateNotNullorEmpty()] [Bool] $Shared = $True, [Parameter(Mandatory=$False, ValueFromPipeline=$False,HelpMessage="Timeout for the Org Network to become Ready")] [ValidateNotNullorEmpty()] [int] $Timeout = 120 ) Process { ## Get Org vDC Write-Verbose "Get Org vDC" [Array] $orgVdc = Get-Org -Name $OrgName | Get-OrgVdc -Name $OrgVdcName if ( $orgVdc.Count -gt 1) { throw "Multiple OrgVdcs found!" } elseif ( $orgVdc.Count -lt 1) { throw "No OrgVdc found!" } $orgVdcView = $orgVdc| Get-CIView ## Get EdgeGateway Write-Verbose "Get EdgeGateway" [Array] $edgeGateway = Search-Cloud -QueryType EdgeGateway -Name $EdgeName | Get-CIView if ( $edgeGateway.Count -gt 1) { throw "Multiple EdgeGateways found!" } elseif ( $edgeGateway.Count -lt 1) { throw "No EdgeGateway found!" } ## Define Org Network Write-Verbose "Define Org Network" $OrgNetwork = new-object vmware.vimautomation.cloud.views.orgvdcnetwork $OrgNetwork.name = $Name $OrgNetwork.edgegateway = $edgeGateway.id $OrgNetwork.isshared = $Shared $OrgNetwork.configuration = new-object vmware.vimautomation.cloud.views.networkconfiguration $OrgNetwork.configuration.fencemode = "natRouted" $OrgNetwork.configuration.ipscopes = new-object vmware.vimautomation.cloud.views.ipscopes $Scope = new-object vmware.vimautomation.cloud.views.ipScope $Scope.gateway = $Gateway $Scope.netmask = $SubnetMask $Scope.ipranges = new-object vmware.vimautomation.cloud.views.ipranges $Scope.ipranges.iprange = new-object vmware.vimautomation.cloud.views.iprange $Scope.ipranges.iprange[0].startaddress = $IPRangeStart $Scope.ipranges.iprange[0].endaddress = $IPRangeEnd $OrgNetwork.configuration.ipscopes.ipscope += $Scope ## Create Org Network Write-Verbose "Create Org Network" $CreateOrgNetwork = $orgVdcView.CreateNetwork($OrgNetwork) ## Wait for Org Network to become Ready Write-Verbose "Wait for Org Network to become Ready" while(!(Get-OrgVdcNetwork -Id $CreateOrgNetwork.Id -ErrorAction SilentlyContinue)){ $i++ Start-Sleep 5 if($i -gt $Timeout) { Write-Error "Creating Org Network."; break} Write-Progress -Activity "Creating Org Network" -Status "Wait for Network to become Ready..." } Write-Progress -Activity "Creating Org Network" -Completed Start-Sleep 1 Get-OrgVdcNetwork -Id $CreateOrgNetwork.Id | Select-Object Name, OrgVdc, NetworkType, DefaultGateway, Netmask, StaticIPPool, @{ N='isShared'; E = {$_.ExtensionData.isShared} } | Format-Table -AutoSize } }
Funktionen wie diese, mit sehr vielen Parametern sind meist etwas umständlich aufzurufen. Ein kleiner Tipp um das übersichtlicher zu gestalten ist daher dieses Vorgehen:
$params = @{ 'Name' = '<String>'; 'OrgVdcName'=<String>''; 'OrgName'='<String>'; 'EdgeName'='<String>'; 'SubnetMask' = '255.255.255.0'; 'Gateway' = '192.168.66.1'; 'IPRangeStart' = '192.168.66.100'; 'IPRangeEnd' = '192.168.66.200' } New-MyOrgNetwork @params -Verbose
vCloud Director Org Netzwerk bearbeiten
In einer anderen Community Diskussion kam zusätzlich das Thema auf, wie solche Netze mit VMware PowerCLI bearbeitet werden können. Hierfür kann ich ganz klar das Vorgehen mit Hilfe der UpdateServerData() Methode empfehlen:
C:\> Get-OrgVdcNetwork -Name Test | Select-Object Name, DefaultGateway, Description Name DefaultGateway Description ---- -------------- ----------- Test 192.168.66.1 C:\> $OrgNetView = Get-OrgVdcNetwork -Name Test | Get-CIView C:\> $OrgNetView.Description = "Test Network" C:\> $OrgNetView.UpdateServerData() C:\> Get-OrgVdcNetwork -Name Test | Select-Object Name, DefaultGateway, Description Name DefaultGateway Description ---- -------------- ----------- Test 192.168.66.1 Test Network
Veröffentlichung in der PowerShell Gallery
Mit dieser Aktualisierung meine vCloud Director PowerShell Moduls habe ich es auch direkt in der PowerShell Gallery veröffentlicht.
VMware-vCD-Module
No Responses