Ich habe mir seit langer Zeit vorgenommen, die Nitro API des Netscalers unter die Lupe zu nehmen und nun hat es tatsächlich geklappt. Befassen möchte ich mich mit der CSharp Variante der API und im folgenden die grundlegenden Schritte zur Installation und zum initialen Verbindungsaufbau zum Netscaler beschreiben, da dies oft die erste Hürde darstellt.
Der Nitro Webservice ist standardmaäßig auf jeder Netscaler Appliance aktiv und kann über drei Wege angesprochen werden: C Sharp, Java oder REST (REpresentational State Transfer)
Ich werde mich in diesem Beitrag auf die C Sharp Variante konzentrieren.
1. Download des Netscaler SDKs von citrix.com
Der erste Schritt ist der Download des SDKs in der passenden Version. In meinem Fall ist das die Version 10.1.x
2. Installation und bereitstellen der API
Die Datei ns-10.1-124.13-nitro-csharp.tgz entpacken und nach Wunsch im lokalen Filesystem ablegen. Ich habe mich für die folgende Ordnerstruktur entschieden:
Für das weitere Vorgehen sind vor allem die beiden Files im Ordner /lib von Relevanz, da diese unsere Schnittstelle zum SDK bilden.
3. Der erste Verbindungsaufbau
Einbinden der Runtime in unser erstes Skript.
$path1 = Resolve-Path C:NitrolibNewtonsoft.Json.dll [System.Reflection.Assembly]::LoadFile($path1) $path = Resolve-Path C:Nitrolibnitro.dll [System.Reflection.Assembly]::LoadFile($path)
Globale Verbindungsvariablen erstellen:
$nsip = '192.168.101.200' $user = 'nsroot' $pass = 'nsroot'
Session-Objekt anlegen und Login initiieren:
$nitrosession = new-object com.citrix.netscaler.nitro.service.nitro_service($nsip,"http") $session = $nitrosession.login($user,$pass)
Die Datei kann nun in einem beliebigen Ordner als *.ps1 ablegt werden.
4. Die ersten Aktionen am Netsclaer
Da nun der Logon durchgeführt ist, haben wir Zugriff auf alle Funktionen des Netscalers und können diese über die definierten Klassen bzw. Objekte ansprechen.
Als erstes einfaches Beispiel möchte ich einen Server hinterlegen. Dazu benötigen wir wiederum ein Objekt der com.citrix.netscaler.nitro Klasse. Alle Befehle sind nach diesem Schema aufgebaut. Ein Blick ins Filesystem zeigt, wie man bei der Vielzahl von Befehlen den Überblick behalten kann.
Alle Objekte starten wie beschrieben mit com.citrix.netscaler.nitro., gefolgt vom Konfigurations-Item, welches bearbeitet werden soll.
Zu finden sind diese Items auch in der Filestruktur:
Interessant für unsere Konfigurationen ist, im ersten Schritt v.a. der Ordner „config“ und der Ordner „Basic“. Hier finden wir eine Datei „server.cs“. Öffnen wir diese mit Visual Studio (alternativ auch Notepad++) finden wir eine Section „public class server“. In diesem Bereich ist zu erkennen, mit welchen Parametern ein Objekt vom Typ „Server“ adressiert werden kann.
Mit diesen Informationen kann also ein erstes neuen Objekt „server1“ erstellt werden.
$server1 = New-Object com.citrix.netscaler.nitro.resource.config.basic.server
Dieses Objekt müssen wir nun mit den entsprechenden Attributen befüllen, welche man der Datei server.cs entnehmen können:
$server1.name = "WebServer01"; $server1.ipaddress = "192.168.88.100";
Abschließend wird dieses Objekt an die bestehende Session übergeben.
$set_config=[com.citrix.netscaler.nitro.resource.config.basic.server]::add($nitrosession,$server1)
Analog dazu kann auch Service erstellt werden
$service1 = New-Object com.citrix.netscaler.nitro.resource.config.basic.service $service1.name = "SVC_IIS"; $service1.servicetype = "HTTP"; $service1.monitor_name_svc ="http"; $service1.port="80"; $service1.servername="WebServer01"; $set_config=[com.citrix.netscaler.nitro.resource.config.basic.service]::add($nitrosession,$service1)
Auch ein Load Balancer kann auf diese Weise erzeugt werden
$lb1 = New-Object com.citrix.netscaler.nitro.resource.config.lb.lbvserver $lb1.name="vSRV_LB01"; $lb1.servicetype="http"; $ret_value=[com.citrix.netscaler.nitro.resource.config.lb.lbvserver]::add($nitrosession,$lb1)
$lb1.name="vSRV_LB01"; $lb1.lbmethod="ROUNDROBIN"; $set_config=[com.citrix.netscaler.nitro.resource.config.lb.lbvserver]::update($nitrosession,$lb1)
$lb_service = New-object com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding $lb_service.name = "vSRV_LB01"; $lb_service.servicename = "SVC_IIS"; $set_config=[com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding]::add($nitrosession,$lb_service)
Abschließend die Änderungen noch in die saved config übernehmen
$session = $nitrosession.save_config()
Session beenden
$session = $nitrosession.logout()
Ich hoffe, dass ich so einen kurzen Einblick in die große Welt der NITRO API geben konnte und den Einstieg etwas erleichert habe.
Marco Klose works as a Technical Consultant, Architect and CTO focused on Application & Desktop virtualization as well as application delivery with the Citrix product portfolio. He is specialized in Citrix virtualization, Citrix networking and Microsoft products. He has +10 years experience and holds the latest Citrix certifications and is member of the Citrix Partner Expert Council EMEA (PTEC). Since 2021 he is also a Citrix Technology Advocate (CTA).