Objekte in NSX-T Policy API mit VMware PowerCLI erstellen

Von | 8. Januar 2020

This post is also available in: Englisch

Über VMware PowerCLI

VMware PowerCLI ist ein command-line und scripting Werkzeug, das in Windows PowerShell integriert ist. Es gibt merh als 700 cmdlets zur Verwaltung und Automatoisierung von vSphere, vCloud, vRealize Operations Manager, vSAN, NSX-T, VMware Cloud on AWS, VMware HCX, VMware Site Recovery Manager, und VMware Horizon Umgebungen.

Mehr über VMware PowerCLI finden Sie auf der folgenden Webseite VMware {code}.

Über NSX-T Policy API

Policy API ist die “neue” API die in der Version NSX-T 2.4 eingeführt wurde und steuert die Objekte in der sogenannten simplified UI um die Objekte einfacher verwalten zu können.

Es unterscheidet sich von der “alten” API (aka NSX -T Management Plane API) die Objekte in der Advanced Networking & Security UI verwaltet.

Die meisten Systeme (wie vRA, Kubernetes, etc.) können sowohl beide APIs bedienen aber es ist ein Trend zu erkennen dass die neue API immer mehr an Bedeutung gewinnt.

Über SDK Toolkit und PowerCLI

VMware NSX-T generiert die CMDLETS mit dem SDK Toolkit und sobald eine neue Version von NSX verfügbar ist, ist auch eine neue Version von PowerCLI verfügbar. Dadurch stehen nach einem Update alle Funktionen als CMDLETS zur Verfügung.

Disclaimer

Wenn Sie mit PowerCLI starten wollen gibt es eine Vielzahl von Blog Artikeln in denen erklärt wird, wie PowerCLI auf Windows, Mac oder Linux eingesetzt werden kann. In meinem Blog gehe ich daher nicht auf die Eirichtung von PowerCLI ein sondern nur auf das Zusammenspiel zwischen PowerCLI und NSX.

Wenn Sie PowerCLI in Verbindug mit NSX-T in Produktiv Umgebungen verwenden wollen, sprechen Sie bitte Ihren Ansprechpartner bei VMware an um mehr über die Support Möglichkeiten zu erfahren!

Lasst und mit PowerCLI für NSX-T

Allgemeine Informationen

Es gibt vier CMDLETS, wenn man nach NSX-T sucht.

Get-Module "VMware.VimAutomation.Nsx*" -ListAvailable
Connect-NsxtServer
Disconnect-NsxtServer
Get-NsxtPolicyService
Get-NsxtService

Aber mit diesen vier Modulen können alle Objekte im NSX Manager verwaltet werden….wenn man weiß wie;-)

Da wir Objekte in der Policy API anlegen wollen benötigen wir CMDLET “Get-NsxtPolicyService”

Login auf den NSX Manager and auslesen der Module

Um alle möglichen Module von NSX-T anzeigen zu lassen müssen wir uns erst einmal an unserem NSX Manager anmelden.

Connect-NsxtServer -Server IP-Address/DNS-Name -User Username -Password password

Wenn die Anmeldung erfolgreich war sollten Sie eine ähnliche Anzeige erhalten:

Connect to NSX

Jetzt können wir uns alle Module anzeigen lassen. Das Auslesen dauert einen moment um alle Module anzuzeigen (Momentan sind 286 Module vorhanden). Ich habe mir die Module Informationen in einer Text Datei gespeichet um nicht jedes mal eine Abfrage zu starten, wenn ich nach einem Module suche. Der Befehl zum auslesen ist wie folgt:

Get-NsxtPolicyService

Erstellen eines T1 Routers

Das nachfolgende Scriopt erstellt einen T1 Router

#Variables for NSX Manager Connection
$nsxmanagerip = "IP_OR_DNS_NAME"
$nsxuser = "USERNAME"
$nsxpasswd = "PASSWORD"
#General Variables
$description = "Created with VMware PowerCLI"
$tag = "powercli"
#Variables for T1 Router
$t1routerid = "NAME_OF_NEW_T1_ROUTER"
$t1routerpath_to_t0_rtr = "/infra/tier-0s/NAME_OF_NEW_T0_ROUTER"
$t1routeradvertisement = @("TIER1_IPSEC_LOCAL_ENDPOINT","TIER1_CONNECTED")
#Connect to NSX Manager
Connect-NsxtServer -Server $nsxmanagerip -User $nsxuser -Password $nsxpasswd
#Retrieve Router Information
$t1routerdata = Get-NsxtPolicyService -Name com.vmware.nsx_policy.infra.tier1s
#Set Variables
$t1routerspecification = $t1routerdata.Help.patch.tier1.Create()
$t1routerspecification.description = $description
$t1routerspecification.id = $t1routerid
$t1routerspecification.display_name = $t1routerid
$t1routerspecification.tier0_path = $t1routerpath_to_t0_rtr
$t1routerspecification.route_advertisement_types = $t1routeradvertisement
#Add Tag to the Router
$t1routertag = $t1routerdata.Help.patch.tier1.tags.Element.Create()
$t1routertag.tag = $tag
$t1routerspecification.tags.Add($t1routertag) | Out-Null
#Create T1 Router
$t1routerdata.patch($t1routerspecification.id, $t1routerspecification)

Jede Zeile die mit dem Dollarzeichen beginnt “$” wird von PowerShell als Variable erkannt. Für eine einzelne Variable wird der Inhalt in Anführungszeichen oder Hochkommatas eingebettet. “inhalt” 

Eine Liste von Variablen wird in Klammern, beginnend mit einem @ eingebettet. @(“inhalt1″,”inhalt2”)

Als erstes müssen die Variablen für die Verbindung zum NSX Manager gesetzt werden.

$nsxmanagerip = "IP_OR_DNS_NAME" 
$nsxuser = "USERNAME" 
$nsxpasswd = "PASSWORD"

Als nächstes definieren wir Variablen, um die Objekte mit einer Beschreibung und einem TAG zu versehen. Das hilft dabei wenn man später nach diesen Objekten suchen möchte.

$description = "Created with VMware PowerCLI"
$tag = "powercli"

Damit der T1 Router auch an einen vorhandenen T0 Router angeschlossen werden kann beötigen wir noch die folgenden Variablen.

$t1routerid = "NAME_OF_NEW_T1_ROUTER" 
$t1routerpath_to_t0_rtr = "/infra/tier-0s/NAME_OF_NEW_T0_ROUTER"
$t1routeradvertisement = @("TIER1_IPSEC_LOCAL_ENDPOINT","TIER1_CONNECTED")

Falls noch nicht geschehen wird über das nachfolgende Kommando die verbindung zum NSX Manager aufgebaut. Wenn die Verbindung schon steht sollte diese Zeile mit einer Raute “#” auskommentiert werden.

Connect-NsxtServer -Server $nsxmanagerip -User $nsxuser -Password 

Wir setzen nun eine Variable mit den nötigen Informationen die wir brauchen um den Router anlegen zu können. Die Infos für die Variable zeiehn wir aus den Modulen die wir als erstes ausgelesen haben.

$t1routerdata = Get-NsxtPolicyService -Name com.vmware.nsx_policy.infra.tier1s

Jetzt können wir die Informationen über alle bereits angelegten T1 Router anzeigen lassen und außerdem die Struktur verstehen.

$t1routerdata.list().results

Beispiel Output:

Mit Get-Member werden kann angezeigt werden welche Pflichtinformationen vorhanden sein müssen um ein neues Objekt anlegen zu können.

$t1routerdata | Get-Member

Für uns ist das Feld “patch” wichtig. Es werden die Informationen tier1_id und tier1 benötigt um einen T1 Router zu erstellen oder die Kofniguration zu verändern.

Wir erstellen jetzt eine Variable um die Router Specifikationen zu speichern.

$t1routerspecification = $t1routerdata.Help.patch.tier1.Create()

Nachdem wir die Variable erstellt haben können wir auslesen welche Eingabe Informationen zur Verfügung stehen und wie die Struktur sein muss.

$t1routerspecification

“String” heißt single input, “List<string>” heißt single oder multiple inputs and “boolean” heißt yes or no.

Input Parameter  bei denen in den eckigen Klammern “com.vmware.” steht sind  child oderr nested Objekte und können benötigen weiterer Maßnahmen um die Informationen richtig zu setzen. Dazu kommen wir später wenn wir einen TAG auf dem Router setzen.

Die folgenden Routervariablen werden benötigt:

$t1routerspecification.description = $description
$t1routerspecification.id = $t1routerid
$t1routerspecification.display_name = $t1routerid
$t1routerspecification.tier0_path = $t1routerpath_to_t0_rtr
$t1routerspecification.route_advertisement_types = $t1routeradvertisement

Jetzt widmen wir uns den Child/Nested objekten. Das Kommando sieht so ähnlich aus wie das Komando was wir für die Router Spezifikationen genutzt haben. Aber jetzt gehen wir einen Schritt tiefer in die Struktur was wir mit dem der Eingabe Element machen.

$t1routertag = $t1routerdata.Help.patch.tier1.tags.Element.Create()

Jetzt können wir auch den Tag setzen.

$t1routertag.tag = $tag
Die Child Variable hängen wir jetzt an die Routerspezifikationen an. “| Out-Null” unterdrückt die Rückmeldung wenn das Script ausgeführt wird.
$t1routerspecification.tags.Add($t1routertag) | Out-Null
Normalwerweise sollten jetzt alle benötigten Felder in der Variable ausgefüllt sein.
$t1routerspecification

Mit dem letzten Befehl wird der T1 Router erstellt und mit dem vorhandenen T0 Router verbunden.

$t1routerdata.patch($t1routerspecification.id, $t1routerspecification)

Wenn das Kommando ohne Fehler durchgelaufen ist, wurde der T1 Router in NSX angelegt. Zur Überprüfung verbinden Sie sich mit der NSX Manager UI und geben auf der Startseite in dem Suchfeld “powercli” ein.

Sie sollten folgende Informationen sehen können.

Erstellen eines logischen Segments

Das Script erstellt ein logisches Segment (logischer Switch)

#Variables for NSX Manager Connection
$nsxmanagerip = "IP_OR_DNS_NAME"
$nsxuser = "USERNAME"
$nsxpasswd = "PASSWORD"
#General Variables
$description = "Created with VMware PowerCLI"
$tag = "powercli"
#Variables for Segment
$segmentid = "SEGMENTNAME"
$transportzone = "/infra/sites/default/enforcement-points/default/transport-zones/TRANSPORTZONEID"
$path_to_t1_rtr = "/infra/tier-1s/T1ROUTERNAME"
$defaultgateway = "IP-ADDRESS/MASK"
#Connect to NSX Manager
Connect-NsxtServer -Server $nsxmanagerip -User $nsxuser -Password $nsxpasswd
#Retrieve Segment Information
$segmentdata = Get-NsxtPolicyService -Name com.vmware.nsx_policy.infra.segments
#Set Variables
$segmentdata = Get-NsxtPolicyService -Name com.vmware.nsx_policy.infra.segments
$segmentspecification = $segmentdata.Help.patch.segment.Create()
$segmentspecification.description = $description
$segmentspecification.id = $segmentid
$segmentspecification.transport_zone_path = $transportzone
$segmentspecification.connectivity_path = $path_to_t1_rtr
#Set Default Gateway Variables
$subnetSpec = $segmentdata.help.patch.segment.subnets.Element.Create()
$subnetSpec.gateway_address = $defaultgateway
$segmentspecification.subnets.Add($subnetSpec) | Out-Null
#Add Tag to the Segment
$segmenttag = $segmentdata.help.patch.segment.tags.Element.Create()
$segmenttag.tag = $tag
$segmentspecification.tags.Add($segmenttag) | Out-Null
#Create Segment
$segmentdata.patch($segmentid, $segmentspecification)

Ich werde nur die Details erklären die bei der Erstellung des Segments anders sind. Folgende Variablen werden für das Segment benötigt.

$segmentid = "SEGMENTNAME"
$transportzone = "/infra/sites/default/enforcement-points/default/transport-zones/TRANSPORTZONEID"

Die Transport Zone UUID kann in dem NSX Manager ausgelesen werden. System->Fabric->Transport Zones

Das Segment verbinden wir mit dem zuvor erstellten T1 Router. Außerdem benötigen wir noch das Default Gateway für die VMs die später an diesem Segment angeschlossen werden sollen.

$path_to_t1_rtr = "/infra/tier-1s/T1ROUTERNAME"
$defaultgateway = "IP-ADDRESS/MASK"

Es werden wieder die Informationen ausgelesen, aber diesmal für das Segment.

$segmentdata = Get-NsxtPolicyService -Name com.vmware.nsx_policy.infra.segments

Mit den folgenden Komandos können wir wieder die Informationen über die Struktur auslesen.

$segmentdata.list().results
$segmentdata | Get-Member

Als nächstes setzen wir die Variablen für das Segment.

$segmentspecification = $segmentdata.Help.patch.segment.Create()
$segmentspecification.description = $description
$segmentspecification.id = $segmentid
$segmentspecification.transport_zone_path = $transportzone
$segmentspecification.connectivity_path = $path_to_t1_rtr

Um die Default Gateway Information zu setzen müssen wir wieder eine Ebene tiefer springen.

$subnetSpec = $segmentdata.help.patch.segment.subnets.Element.Create()
$subnetSpec.gateway_address = $defaultgateway
$segmentspecification.subnets.Add($subnetSpec) | Out-Null

Das gleiche gilt für den Segment Tag

$segmenttag = $segmentdata.help.patch.segment.tags.Element.Create()
$segmenttag.tag = $tag
$segmentspecification.tags.Add($segmenttag) | Out-Null

Abschließend wird das logische Segment erstellt.

$segmentdata.patch($segmentid, $segmentspecification)

Lassen Sie uns prüfen ob wir erfolgreich waren!

Erstellen von Groups

Dieses Script erstellt Groups und benutzt Group Member Attribute die die auf den VMs in Inventory gesetzt werden müssen.

#Variables for NSX Manager Connectionc
$nsxmanagerip = "IP_OR_DNS_NAME"
$nsxuser = "USERNAME"
$nsxpasswd = "PASSWORD"
#General Variables
$description = "Created with VMware PowerCLI"
$tag = "powercli"
#Variables for Groups
$groupdomain = "default"
$groupid = "GROUP_NAME"
$groupmember = "SCOPE_NAME|TAG_NAME"
$groupmember_type = "VirtualMachine"
#Connect to NSX Manager
Connect-NsxtServer -Server $nsxmanagerip -User $nsxuser -Password $nsxpasswd
#Retrieve Group Information
$groupdata = Get-NsxtPolicyService -Name com.vmware.nsx_policy.infra.domains.groups
#Set Group Variables
$groupspecification = $groupdata.Help.patch.group.Create()
$groupspecification.display_name = $groupid
$groupspecification.description = $description
#Add Group Member Variables
$groupexpspecification = $groupdata.Help.patch.group.expression.Element.condition.Create()
$groupexpspecification.member_type = $groupmember_type
$groupexpspecification.value = $groupmember
$groupexpspecification.key="Tag"
$groupexpspecification.operator = "EQUALS"
$groupspecification.expression.Add($groupexpspecification) | Out-Null
#Add TAG to Group
$grouptag = $groupdata.Help.patch.group.tags.Element.Create()
$grouptag.tag = $tag
$groupspecification.tags.Add($grouptag) | Out-Null
#Create Group
$groupdata.patch($groupdomain, $groupid, $groupspecification)

Um eine Gruppe zu erstellen werden wieder Variablen benutzt. Die Domain ist in der Regel “default”, wenn es nicht von Ihnen verändert wurde. Domain und Member Type sind Case Sensitive!

$groupdomain = "default"
$groupid = "GROUP_NAME"
$groupmember = "SCOPE_NAME|TAG_NAME"
$groupmember_type = "VirtualMachine"

Es wird wieder als erstes die Struktur ausgelesen.

$groupdata = Get-NsxtPolicyService -Name com.vmware.nsx_policy.infra.domains.groups

Nun werden die Variablen für die Group gesetzt.

$groupspecification = $groupdata.Help.patch.group.Create()
$groupspecification.display_name = $groupid
$groupspecification.description = $description

Dann noch die Group Kriterien

$groupexpspecification = $groupdata.Help.patch.group.expression.Element.condition.Create()
$groupexpspecification.member_type = $groupmember_type
$groupexpspecification.value = $groupmember
$groupexpspecification.key="Tag"
$groupexpspecification.operator = "EQUALS"
$groupspecification.expression.Add($groupexpspecification) | Out-Null

Und auch hier setzten wir einen Tag

$grouptag = $groupdata.Help.patch.group.tags.Element.Create()
$grouptag.tag = $tag
$groupspecification.tags.Add($grouptag) | Out-Null

Zum Abschluss erstellen wir die Gruppe mit der zusätzlichen Information $groupdomain.

$groupdata.patch($groupdomain, $groupid, $groupspecification)

 

Erstellen einer Firewall Section und Rule

Dieses Script erstellt die Firewall Section and eine Rule
#Variables for NSX Manager Connection
$nsxmanagerip = "IP_OR_DNS_NAME"
$nsxuser = "USERNAME"
$nsxpasswd = "PASSWORD"
#General Variables
$description = "Created with VMware PowerCLI"
$tag = "powercli"
#Variables for Firewallentries
$secdomain = "default"
$policysectionid = "FW_SECTION_NAME"
$rulename = "FW_RULE_NAME"
$source = "/infra/domains/default/groups/GROUPNAME"
$destination = "any"
$service = "any"
$action = "ALLOW"
#Connect to NSX Manager
Connect-NsxtServer -Server $nsxmanagerip -User $nsxuser -Password $nsxpasswd
#Retrieve Firewall Section and Rule Information
$secpolicydata = Get-NsxtPolicyService -Name com.vmware.nsx_policy.infra.domains.security_policies
#Set Firewall Variables
$secpolicyspecification = $secpolicydata.Help.patch.security_policy.Create()
$secpolicyspecification.description = $description
$secpolicyspecification.display_name = $policysectionid
#Set Rule Variables
$secpolicyrule = $secpolicydata.Help.patch.security_policy.rules.Element.Create()
$secpolicyrule.description = $description
$secpolicyrule.display_name = $rulename
$secpolicyrule.source_groups = @($source)
$secpolicyrule.destination_groups = @($destination)
$secpolicyrule.services = @($service)
$secpolicyrule.action = $action
$secpolicyspecification.rules.Add($secpolicyrule) | Out-Null
#Add TAG to Firewall Section
$secpolicytag = $secpolicydata.Help.patch.security_policy.tags.Element.Create()
$secpolicytag.tag = $tag
$secpolicyspecification.tags.Add($secpolicytag) | Out-Null
#Create Firewall Section and Rule
$secpolicydata.patch($secdomain, $policysectionid, $secpolicyspecification)

Es wird eine Firewall Section erstellt und in der Section dann die Regel.

$secdomain = "default"
$policysectionid = "FW_SECTION_NAME"
$rulename = "FW_RULE_NAME"
$source = "/infra/domains/default/groups/GROUPNAME"
$destination = "any"
$service = "any"
$action = "ALLOW"

Auslesen der Firewall Informationen.

$secpolicydata = Get-NsxtPolicyService -Name com.vmware.nsx_policy.infra.domains.security_policies

Setzen der Variablen für die Firewall Section

$secpolicyspecification = $secpolicydata.Help.patch.security_policy.Create()
$secpolicyspecification.description = $description
$secpolicyspecification.display_name = $policysectionid

Setzen der Variablen für die Firewall Rule

$secpolicyrule = $secpolicydata.Help.patch.security_policy.rules.Element.Create()
$secpolicyrule.description = $description $secpolicyrule.display_name = $rulename
$secpolicyrule.source_groups = @($source)
$secpolicyrule.destination_groups = @($destination)
$secpolicyrule.services = @($service)
$secpolicyrule.action = $action
$secpolicyspecification.rules.Add($secpolicyrule) | Out-Null

Tag der Firewall Section

$secpolicytag = $secpolicydata.Help.patch.security_policy.tags.Element.Create()
$secpolicytag.tag = $tag
$secpolicyspecification.tags.Add($secpolicytag) | Out-Null

Erstellen der Firewall Section und der Rule

$secpolicydata.patch($secdomain, $policysectionid, $secpolicyspecification)

Ich hoffe das hilft Ihnen, um mit PowerCLI in Verbindung mit NSX zu starten.

print
Daniel Stich
Follow me

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.